Sql server SQL Server 2008:如何度量创建/重建索引所需的时间?

Sql server SQL Server 2008:如何度量创建/重建索引所需的时间?,sql-server,Sql Server,我正在一个相当大的表上重建SQLServer2008上的非聚集索引 这是密码 CREATE UNIQUE NONCLUSTERED INDEX [idx_Documents_Title] ON [dbo].[Documents] ( -- 3 columns ) WHERE [deleted]=(0) AND [processing]=(0) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF

我正在一个相当大的表上重建SQLServer2008上的非聚集索引

这是密码

CREATE UNIQUE NONCLUSTERED INDEX [idx_Documents_Title] ON [dbo].[Documents]
(
    -- 3 columns
)
WHERE [deleted]=(0) AND [processing]=(0)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

问题。。如何度量重建索引所需的时间?我是.NET开发人员,通常使用StopWatch类来度量时间/性能。我可以应用类似的技术来测量重建所需的时间吗?可能不是因为它看起来索引的重建/创建是异步的。

更改索引。。。重建将同步执行

DECLARE @StartTime DATETIME = SYSDATETIME()

ALTER INDEX [idx_Documents_Title] ON [dbo].[Documents] REBUILD

DECLARE @EndTime DATETIME = SYSDATETIME()

SELECT 
    StartTime = @StartTime, 
    EndTime = @EndTime,
    DifferenceInMinutes = DATEDIFF(MINUTE, @StartTime, @EndTime)
你可以用
@START\u TIME
包装你的代码,然后找到
DATEDIFF
,你可能会发现它运行得太快了,快到了
0


我相信有一些聪明的方法可以做到这一点,但这是总的想法。

@Jeroen Mostert's为我做到了这一点。执行
SET STATISTICS TIME ON
SET STATISTICS TIME ON
为我提供了所需的统计信息。

是什么让您认为此命令是异步的?因此,如果将其放入脚本中,脚本将结束,但过程仍在继续?我想这是可能的,SQL server可能仍在忙着做一些事情——除此之外,您是否可以将其放入存储过程中,并使用一个变量以毫秒为单位计算时间差datediff@DavidG我假设它是异步的,因为它像异步调用一样在一眨眼之间快速运行:)。我错误地认为它是异步的吗?重建肯定不是异步的。T-SQL是一种完全同步和顺序的语言。在批处理中的所有语句逐个实际完成之前,批处理不会完成。如果您指定
ONLINE=ON
,索引创建将不会阻止同一服务器上的其他语句(这是一种异步),但在一个会话中,它总是一个接一个的。如果您只需要测量来观察事物(也就是说,您不需要选择它们并将它们存储在其他地方),
设置统计时间应足够
SET STATISTICS IO ON
将让您更深入地了解SQL Server在构建索引时与磁盘的关系(可能比您想象的要小)。
DECLARE @START_TIME DATETIME
SET @START_TIME = GETDATE()

--your index creation code or whatever you'd like to measure

SELECT DATEDIFF(SECOND, @START_TIME, GETDATE()) AS TOTAL_SECONDS