Questions tagged «sql-server»

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

2
SQL编译对SQL Server的性能有多严重的影响?
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 我正在分析一个SQL Server 2005实例,通过PerfMon的SQLServer:SQL Statistics - SQL Compilations/sec指标,我发现平均值约为170左右。 我剔除了SQL事件探查器,并寻找SP:Compile或SQL:Compile事件。显然它们不存在。我没有找到Stored Procedure/SP:Recompile和TSQL/SQL:StmtRecompile事件。我在探查器中看到的数据量表明这些是看错的事件,尽管我不确定。 所以我的问题。任何一个答案都是不错的。 如何查看SQL Server中正在编译的内容? 我选择了错误的指标来查看吗?在Perfmon还是SQL Profiler中? 关于Stored Procedure/SP:Recompile和TSQL/SQL:StmtRecompileSQL事件探查器中的事件...它们不包括“持续时间”度量标准。如果无法提供查看事件对系统的影响的方法,那么如何评估这些事件对系统的影响。

2
T-SQL查询使用完全不同的计划,具体取决于我要更新的行数
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 我有一个带有“ TOP(X)”子句的SQL UPDATE语句,而我要更新值的行大约有40亿行。当我使用“ TOP(10)”时,我得到一个几乎立即执行的执行计划,但是当我使用“ TOP(50)”或更大时,查询永远不会完成(至少在我等待时)。它使用完全不同的执行计划。较小的查询使用一个非常简单的计划,该计划带有一对索引查找和一个嵌套循环联接,其中完全相同的查询(UPDATE语句的TOP子句中的行数不同)使用的方案涉及两个不同的索引查找,表假脱机,并行性以及其他一系列复杂性。 我已经使用“ OPTION(USE PLAN ...)”来强制它使用由较小查询生成的执行计划-当我这样做时,我可以在几秒钟内更新多达100,000行。我知道查询计划是好的,但是SQL Server仅在只涉及少量行的情况下才会自行选择该计划-更新中任何相当大的行数都会导致次优计划。 我以为应该归咎于并行性,所以我MAXDOP 1对查询进行设置,但是没有任何效果-这一步骤已经过去,但是糟糕的选择/性能却没有。我也sp_updatestats今天早上跑了,以确保不是这个原因。 我已经附上了两个执行计划-计划越短也越快。此外,这是有问题的查询(值得注意的是,无论行数是大还是小,我包含的SELECT似乎都是快速的): update top (10000) FactSubscriberUsage3 set AccountID = sma.CustomerID --select top 50 f.AccountID, sma.CustomerID from FactSubscriberUsage3 f join dimTime t on f.TimeID = t.TimeID join #mac sma on f.macid = …

2
为什么DELETE对性能有持续的影响?
最后是一个测试脚本,用于比较@table变量和#temp表之间的性能。我认为我已正确设置-性能计时已从外部获取在DELETE / TRUNCATE命令进行的。我得到的结果如下(以毫秒为单位)。 @Table Variable #Temp (delete) #Temp (truncate) --------------- -------------- ---------------- 5723 5180 5506 15636 14746 7800 14506 14300 5583 14030 15460 5386 16706 16186 5360 只是为了确保我理智,这表明CURRENT_TIMESTAMP(aka GetDate())是在语句时而不是批处理时使用的,因此TRUNCATE / DELETE与SET @StartTime = CURRENT_TIMESTAMP语句之间不应存在任何交互。 select current_timestamp waitfor delay '00:00:04' select current_timestamp ----------------------- 2012-10-21 11:29:20.290 ----------------------- 2012-10-21 11:29:24.290 当使用DELETE清除表时,在第一次运行和随后的运行之间的跳转中,这是非常一致的。我对DELETE的了解缺少什么?我已经重复了很多次,交换了命令,调整了tempdb的大小,使其不需要增长等。 CREATE TABLE …

2
还原数据库(不包括FILESTREAM数据)
背景 我们正在开发一个系统,该系统的底部有一个大型数据库。它是在SQL Server 2008 R2上运行的MS SQL数据库。数据库的总大小约为12 GB。 其中约有8.5 GB位于单个表中BinaryContent。顾名思义,这是一个表,我们将任何类型的简单文件直接存储在表中作为BLOB。最近,我们一直在测试使用FILESTREAM将所有这些文件从数据库移出到文件系统的可能性。 我们对数据库进行了必要的修改,没有任何问题,并且在迁移之后,我们的系统仍然可以正常工作。该BinaryContent表大致如下所示: CREATE TABLE [dbo].[BinaryContent]( [BinaryContentID] [int] IDENTITY(1,1) NOT NULL, [FileName] [varchar](50) NOT NULL, [BinaryContentRowGUID] [uniqueidentifier] ROWGUIDCOL NOT NULL ) ON [PRIMARY] FILESTREAM_ON [FileStreamContentFG] ALTER TABLE [dbo].[BinaryContent] ADD [FileContentBinary] [varbinary](max) FILESTREAM NULL ALTER TABLE [dbo].[BinaryContent] ADD CONSTRAINT [DFBinaryContentRowGUID] DEFAULT (newsequentialid()) FOR [BinaryContentRowGUID] …


2
为什么IDENTITY_INSERT ON一次只能在一个表上使用?
在这种情况下,一次只能在一个数据库表中将IDENTITY_INSERT设置为ON,但是为什么呢?由于IDENTITY列不是全局唯一的,所以我无法想到可能由于将标识同时插入一个以上的表而引起的任何危险情况(至少没有比使用IDENTITY INSERT进行伪造更危险)。 很少使用IDENTITY INSERT,但是硬限制的原因是什么?
20 sql-server 

1
列存储索引的结构是什么?
代号Denali为SQL Server 2012的新功能之一是Columnstore索引。 我对常规的旧行存储索引了解很多,例如b树结构,叶级页面和b树页面之间的存储差异,所包含字段的影响,优化使用它们,键顺序等。 我很难获得有关columnstore索引内部的任何良好信息。 结构如何? 有树吗?还有其他结构吗? 数据如何组织? 哪种类型的特定运算符最适合使用它? 使用其他反图案时要避免使用它们? 我可以找到的很多关于它们的内容基本上与“正常”索引完全相反,即,没有键的顺序,没有包含的字段,仅是非聚集的。 任何见解都表示赞赏。



4
为什么要先对NULL排序?
为什么当我们在列中有一个NULL值并按值升序排序时,这些NULL首先排序? select 1 as test union all select 2 union all select NULL union all select 3 union all select 4 order by test 结果是 NULL 1 2 3 4 我一直认为NULL表示“不确定”或可能的“未知”。如果是这样,那么由于该值可能大于所有其他值,它们是否会排在最后?(或者这是某处的排序选项?) 我使用的是SQL Server 2008R2,但我怀疑在所有SQL Server以及所有RDBMS中都是如此。

1
如何获得MAX行
在SQL Server中,我总是很难获得数据集的最大行数,我正在寻找一种方法列表,以获取有关性能和可维护性的一些指导来检索最大行数。 样品表: DECLARE @Test TABLE (ID INT IDENTITY(1,1), name VARCHAR(50), dateOfBirth DATETIME, TaxNumber varchar(10)) INSERT INTO @Test (name, dateOfBirth, TaxNumber) SELECT 'Fred', convert(datetime, '25/01/1976', 103), '123' UNION ALL SELECT 'Bob', convert(datetime, '03/03/1976', 103), '234' UNION ALL SELECT 'Jane', convert(datetime, '13/06/1996', 103), '345' UNION ALL SELECT 'Fred', convert(datetime, '14/02/1982', 103), …
20 sql-server 

2
重建事务日志
我们有一个非常大的数据库(〜6TB),该数据库的事务日志文件已删除(在SQL Server关闭的同时,我们已经尝试过: 分离并重新附加数据库;和 删除事务日志文件 ...但是到目前为止没有任何效果。 我们目前正在运行: ALTER DATABASE <dbname> REBUILD LOG ON (NAME=<dbname>,FILENAME='<logfilepath>') ...但是鉴于数据库的大小,这可能需要几天才能完成。 问题 上面的命令与下面的命令有区别吗? DBCC CHECKDB ('<dbname>', REPAIR_ALLOW_DATA_LOSS) 我们应该REPAIR_ALLOW_DATA_LOSS代替执行吗? 值得注意的是,数据是从其他来源派生的,因此可以重建数据库,但是我们怀疑,与重新插入所有数据相比,修复数据库要快得多。 更新资料 对于那些得分较高的用户:该ALTER DATABASE/REBUILD LOG命令在36小时后完成并报告: 警告:数据库“ dbname”的日志已重建。事务一致性已丢失。RESTORE链已损坏,并且服务器不再在先前的日志文件上具有上下文,因此您将需要知道它们是什么。 您应该运行DBCC CHECKDB来验证物理一致性。数据库已置于仅dbo模式。当准备好使数据库可用时,您将需要重置数据库选项并删除所有额外的日志文件。 然后,我们运行了一个DBCC CHECKDB(花了大约13个小时),这是成功的。可以说,我们都已经了解了数据库备份的重要性(并授予项目经理对服务器的访问权限...)。

5
监视SQL Server数据库状态的最佳查询是什么?
我希望能够运行查询以获取有关数据库状态的关键信息。即,我希望查询能够判断数据库是否处于良好状态。 这是我为此检查继承的查询: SELECT name AS [SuspectDB], DATABASEPROPERTY(name, N'IsSuspect') AS [Suspect], DATABASEPROPERTY(name, N'IsOffline') AS [Offline], DATABASEPROPERTY(name, N'IsEmergencyMode') AS [Emergency], has_dbaccess(name) AS [HasDBAccess] FROM sysdatabases WHERE (DATABASEPROPERTY(name, N'IsSuspect') = 1) OR (DATABASEPROPERTY(name, N'IsOffline') = 1) OR (DATABASEPROPERTY(name, N'IsEmergencyMode') = 1) OR (has_dbaccess(name) = 0) 如果该查询返回任何结果,则假定数据库处于可疑状态或潜在的不良状态。 有一个更好的方法吗?

5
在T-SQL中使用IF会削弱还是破坏执行计划的缓存?
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 有人向我建议,在t-SQL批处理中使用IF语句会降低性能。我试图找到一些确认或验证此断言。我正在使用SQL Server 2005和2008。 断言是以下批处理: IF @parameter = 0 BEGIN SELECT ... something END ELSE BEGIN SELECT ... something else END SQL Server无法重新使用生成的执行计划,因为下一次执行可能需要其他分支。这意味着SQL Server将基于执行当前可以确定需要哪个分支的基础,从执行计划中完全消除一个分支。这是真的吗? 另外在这种情况下会发生什么: IF EXISTS (SELECT ....) BEGIN SELECT ... something END ELSE BEGIN SELECT ... something else END 无法提前确定执行哪个分支的地方?


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.