Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

1
从不同表中使用ORDER BY选择TOP 1时如何设置索引视图
我正在努力在以下情况下设置索引视图,以便在执行以下查询时不会进行两次聚集索引扫描。每当我为该查询创建索引视图然后使用它时,它似乎都会忽略我在其上放置的任何索引: -- +++ THE QUERY THAT I WANT TO IMPROVE PERFORMANCE-WISE +++ SELECT TOP 1 * FROM dbo.TB_test1 t1 INNER JOIN dbo.TB_test2 t2 ON t1.PK_ID1 = t2.FK_ID1 ORDER BY t1.somethingelse1 ,t2.somethingelse2; GO 表格设置如下: 两张桌子 它们由上面的查询通过内部联接联接 并按上面的查询从第一个表开始的列排序,然后从第二个表开始的列排序;仅选择TOP 1 (在下面的脚本中,还有一些行可以生成测试数据,以防万一有助于重现问题) -- +++ TABLE SETUP +++ CREATE TABLE [dbo].[TB_test1] ( [PK_ID1] [INT] IDENTITY(1, …

3
如何回答为什么突然需要索引或查询的问题
我是具有3年经验的初级DBA。我们的工作是微调查询或建议开发人员应重写特定代码或需要索引。 开发团队经常问的一个简单问题是:“昨天运行良好,突然发生了什么变化?” 我们将被要求检查基础设施方面。对任何问题的第一反应总是似乎是将最大的责任归咎于基础架构,这始终是首先要进行验证的事情。 我们应该如何回答开发团队的“已更改”问题?你们曾经遇到过同样的情况吗?如果是这样,请分享您的经验。

3
在不使用触发器的情况下,在SQL Server中查找触发查询的客户端的身份?
我目前正在使用Change Data Capture(CDC)来跟踪数据更改,并且希望跟踪提交进行了更改的查询的客户端的主机名和IP地址。如果有5个不同的客户端通过相同的用户名登录,则一个客户端将面临跟踪5个客户端中的哪一个引发查询的难题。我发现的其他可能的解决方案包括使用以下命令更改CDC表: ALTER TABLE cdc.schema_table_CT ADD HostName nvarchar(50) NULL DEFAULT(HOST_NAME()) 但是,这将返回在其上触发查询的服务器的主机名,而不是触发该查询的客户端的主机名。 有办法解决这个问题吗?这将有助于记录客户端的主机名或IP地址(或其他唯一身份)。我不想使用触发器,因为它会减慢系统速度,而且CDC还会生成系统表,因此显然不可能在上面设置触发器。

4
是否可以使用SQL Server评估版开发SSIS
我们正在考虑购买SQL Standard Server来实施ETL via SSIS。由于这对我们来说非常昂贵,因此我想在免费版本上测试开发SSIS软件包。由于快速版本未集成SSIS,因此我想在SQL Server 2014 的评估版180过期版本上进行尝试,但找不到任何有关 - Is it possible - Are there limitations. 有人可以帮我吗?
11 sql-server  ssis 


1
HADR_SYNC_COMMIT的奇怪情况等待
我们注意到HADR_SYNC_COMMIT在我们的环境中等待的一种有趣模式。我们有三个副本。数据中心中有一个主,一个同步辅助和一个异步辅助,我们刚刚在另一个数据中心(相距约2400英里)中添加了三个ASYNC副本。 从那时起,我们开始注意到HADR_SYNC_COMMIT等待的数量大大增加。当我们查看活动会话时,我们看到一堆COMMIT TRANSACTION查询在SYNC副本上等待 从屏幕截图中,我们可以清楚地看到HADR_SYNC_COMMIT6月29日的等待时间有所增加,我们最终于7月1日中午某个时候在远程数据中心删除了三个异步副本中的“两个”。这大大减少了等待时间。 到目前为止,我们已检查的内容–日志发送队列,重做队列,远程副本上的上次强化时间和上次提交时间。我们在工作时间内连续发生小笔交易,因此在给定的时间戳(介于60KB和1MB之间的任何地方),发送队列非常小。远程副本几乎是同步的,副本上任何单独的lsn的上次提交时间和上次强化时间之间的差异很小。 网络管道为10G,我们将传输缓冲区的大小从256兆修改为2兆,这是在假定网络正在丢弃数据包并重新传输数据的前提下完成的。两种方法似乎都没有太大帮助。 因此,我想知道ASYNC副本与HADR_SYNC_COMMIT等待有什么关系?SYNC副本不应该仅依赖于此等待类型吗,我在这里缺少什么?

2
SARG基数估计,为什么不进行全扫描?
为什么没有全扫描(在SQL 2008 R2和2012上)? 测试数据: DROP TABLE dbo.TestTable GO CREATE TABLE dbo.TestTable ( TestTableID INT IDENTITY PRIMARY KEY, VeryRandomText VarChar(50), VeryRandomText2 VarChar(50) ) Go Set NoCount ON Declare @i int Set @i = 0 While @i < 10000 Begin Insert Into dbo.TestTable(VeryRandomText, VeryRandomText2) Values(Cast(Rand()*10000000 as VarChar(50)), Cast(Rand()*10000000 as VarChar(50))); Set @i …

1
进行大容量插入时,SSDT Schema Compare不起作用
我正在一个大型ETL和DW项目中工作,在该项目中我们将TFS /源代码控制与SSIS和SSDT一起使用。 今天,我发现,当SSIS包对数据库表执行批量插入时,无法对该数据库执行SSDT架构比较。这很不幸,因为我们的某些软件包需要很长时间才能完成。我们希望使用“模式比较”功能来检测对数据库结构的更改,以便将其保存在我们的SSDT项目中,以进行数据库的版本控制。 仔细研究一下,我发现SSDT中的Schema Compare函数执行一个SQL脚本,该脚本OBJECTPROPERTY()在数据库的表上调用系统函数。特别是在我的情况下,OBJECTPROPERTY(<object_id>, N'IsEncrypted')当<object_id>引用当前正在批量插入的表时,对的任何调用似乎都被阻止了。 在Visual Studio中,SSDT架构比较会在一段时间后简单地超时,并声称未检测到差异。 SSDT中是否有解决此问题的方法,还是应该尝试提交MS Connect错误报告? 或者,由于BULK INSERT来自SSIS包,是否有某种方法可以在不锁定OBJECTPROPERTY表调用的情况下进行此插入?编辑:在SSIS OLE DB目标中,我们可以删除“锁定表”中的复选标记,该标记如其所愿,但这在某些情况下可能会损害性能。我对允许SSDT架构比较执行其工作的解决方案更感兴趣,即使某些对象被锁定。
11 sql-server  ssis  ssdt 

6
在没有2005或2008实例的情况下从SQL Server 2000迁移到2012
我遇到了三个旧的数据库,它们都安装在SQL Server 2000上,我需要移至2012年。我认为标准方法是还原到2005或2008实例,更新,重新导出并最终还原到2012年。 很好,除非我们没有2005或2008实例。 是否有任何替代方法或其他方法可能值得尝试? 作为参考,数据库仅包含15-20个表和一些视图,它们看起来非常简单,备份大小仅为100-200MB。

1
在实际安装之前,从可用设置中确定SQL Server版本和版本?
我们正在经历从SQL Server 2008 R2 Enterprise到标准版的降级过程。 为了启动上述活动,我们正在寻找可用的SQL Server标准版。我们找到了一个,但对以下几点感到困惑: 安装文件(由以前的团队成员保存)位于一个名为SQL Server 2008 R2的文件夹中,但是为了在开始安装之前进行交叉检查,我们通过了default.ini文件,该文件显示: SQLSERVER2008 Configuration File [SQLSERVER2008] 这使人怀疑这是否是所需的SQL Server的正确版本。那么,在我们继续尝试安装之前,如果上述方法无法确定版本,还有其他方法吗? 我们是否还可以检查该可用SQL Server的版本,因为在设置上,我们几乎无法确定它是否真的是标准版? 根据我们的安全政策,我们不能简单地下载新媒体。此外,我们无权下载。

2
概念性ERD多表多对多,还是可能递归?
我正在创建一个概念图[是的,我知道我已经包括了属性和键-但这只是为了巩固我在学习时正在做的事情] –因此,请把它视为概念图,重点放在关系和表而不是如何绘制;) 我的想法障碍是: 我正在尝试确定对个人档案,位置和组织关系进行建模的最佳方法。 首先,规则: 一个或多个个人资料可以是一个或多个组织的成员/朋友;反之亦然。 一个或多个个人资料可以是其他个人资料的成员/朋友。 一个或多个组织可以是其他组织的成员/朋友。 朋友和会员的不同之处在于,朋友就像只读的,而会员(取决于级别)具有完全的修改权限。 为了进一步使事情复杂化,场所具有自己的一组“更进一步”的可完善规则,例如,一个组织拥有两个场所,但是根据场所规则,该组织的成员[ 个人资料 ]可能在一个场所具有完全访问权限,但在该场所具有受限访问权限其他。[抱歉:您可能必须在另一个窗口中打开图像才能获得更好的查看尺寸。] 因此,正如您所看到的,“个人档案”和“组织”的概念几乎相同,而“ Friends and Members” [...]这个尚未建模的概念[...我想它将像设置Owner /的当前中介表一样处理记录中的管理员/成员/朋友等]。因此,为什么我要考虑以下概念: 请参见上图中的Option.2:它将删除当前的Organization和Organization_Locations表及其关系,将其替换为Option.2 Organization Table作为与Profile的某种递归关系。 我想问题的症结在于我是否在编程方面对多态性过于介意,以至于损害了其简单性和灵活性,使自己在整个过程中陷入混乱;) 谢谢您的提前考虑,非常感谢-M :)。 修改后的图: 针对MDCCL的问题: 是的,Profile是由一个Person组成的,并且具有相同的含义-尽管您的理论依据是-我相信您是正确的:Organization和Person可以是Profile的子类型;因此,概要由一个人或一个组织组成。 每个配置文件一个电子邮件地址。 是。如上所述,组织的至少应具有一个电子邮件地址。 正确,一个固定地址。 这是一种可能性,但是很罕见-尽管从我的经验中学到了-因此应该为将来的寿命等建模,并且为了确认,一个位置因此可以由多个人拥有。 位置绝对是大多数其他位置之间不可或缺的实体。也许我会在这里澄清一下可以做什么,然后让您阅读我的其他答案,希望这些答案可以先对该问题进行有益的补充[ 然后再查看我对#6的答案 ];)Re:角色所有者。 An **Organization** can be an Owner of zero or more **Locations**. A Person can be an …

3
验证现有用户的密码策略
我最近进入一种环境,其中许多数据库登录都未enforce_password_policy启用该标志。 即将进行的审核需要验证这些登录名的密码。 我使用以下查询来获取登录列表以及这些标志是打开还是关闭。 select @@SERVERNAME as servername, name, IS_SRVROLEMEMBER('sysadmin', name) as SYSADMIN, type_desc, create_date, is_policy_checked, is_disabled, password_hash, PWDCOMPARE(name, password_hash) as UsernameAsPassword FROM sys.sql_logins 但是,这并不能告诉我密码是否实际上遵守密码策略,因为该标志仅在创建用户时才相关。 有已知的方法来测试现有用户的密码策略遵从性吗? 我无法访问旧密码,因此我希望使用不需要它们的方法。

1
高PAGELATCH_ *和WRITELOG等待。他们有关系吗?
我们看到非常高的PAGELATCH_EX和PAGELATCH_SH等待类型以及较高的WRITELOG等待。我已经诊断出导致PAGELATCH等待的查询,并且可以通过降低插入由IDENTITY值定义的繁忙集群主键的插入率来消除它们。我知道这种现象被称为最后一页插入闩锁争用。 但是我的问题是,当插入新记录时,SQL Server是否在缓冲区页面上执行排他的PAGELATCH_EX,将记录​​插入缓冲区页面,将记录写入事务日志,然后释放排他的PAGELATCH_EX,详情如下:https:// www.microsoft.com/zh-cn/download/details.aspx?id=26665第24页。还是先将记录写到事务日志中,然后再进行PAGELATCH_EX的详细说明,“解决高度并发的PAGELATCH争用-插入工作负载-背景信息SQLCAT的指南:关系引擎 如果将记录写到锁存机制之外的日志中,那么我可以排除对磁盘的慢速写入,这是导致PAGELATCH等待时间较长的原因。但是,如果保持闩锁直到记录难以记录,那么我应该考虑WRITELOG。 同样,具有多个非聚集索引会导致PAGELATCH_ *锁存器保持更长的时间,即,如果表具有聚簇且多个非聚簇索引被同时添加并释放到每个索引缓冲区页的锁存器? 更新1 阅读confio-sql-server-writelog-wait幻灯片2和一般的WAL体系结构之后。现在,我的理解是,两本白皮书中详细介绍的“记录行已被修改的日志条目”步骤是指SQL Server在事务日志缓存(而不是磁盘)中记录更改。一旦事务完成或缓冲区已满,所有记录将立即刷新到磁盘。

2
存储IP地址-varchar(45)与varbinary(16)
我要创建一个表有两个领域- ID作为BIGINT和IPAddress作为两种varchar(45)或varbinary(16)。想法是存储所有唯一的IP地址,并使用引用ID代替IP address其他表中的实际IP 。 通常,我将创建一个存储过程,该存储过程返回ID给定的IP address或(如果未找到地址)插入地址并返回生成的ID。 我期望有很多记录(我无法确切知道有多少条记录),但是我需要上面的存储过程尽快执行。因此,我想知道如何以文本或字节格式存储实际的IP地址。哪个会更好? 我已经编写SQL CLR了将IP地址字节转换为字符串和反向的函数,因此转换不是问题(使用IPv4和都可以IPv6)。 我想我需要创建一个索引来优化搜索,但是我不确定是否应该将该IP address字段包括在聚集索引中,还是要创建一个单独的索引,并且使用哪种类型的搜索会更快?

1
将查询计划按语句拆分以提高可重用性会更好吗?
从我对查询计划如何通过查询进行编译,存储和检索的有限知识中,我了解到多语句查询或存储过程将生成其查询计划,该查询计划将存储在查询计划缓存中,以供查询在将来的执行中使用。 我认为此计划是使用查询哈希从查询计划缓存中检索的,这意味着如果编辑并执行查询,哈希将有所不同,并且会生成新计划,因为在查询计划缓存中找不到匹配的哈希。 我的问题是:如果用户执行多语句查询中的语句之一的语句,是否可以将缓存中已存在的查询计划的相关部分用于多语句查询?我希望答案是否定的,因为哈希值显然不匹配,但是对多语句查询中的每个语句进行哈希处理会更好些,以便用户在查询中运行单个语句可以使用它们吗? 我希望有一些我没有考虑到的复杂因素(而这正是我真正想知道的),但似乎我们可以在许多查询计划中存储相同的“语句计划”,从而占用更多空间并占用更多时间CPU和生成时间。 可能只是显示我的无知。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.