2010-01-22 78 views
1

在试图确定我拿什么区的大型查询我有导致性能问题的三个步骤。包括执行计划,将时间统计设置为打开并立即在我认为可能导致问题的部分之前和之后打印。例如:提问关于时间统计,执行计划和“打印”

print '1' 
SELECT ID FROM Test 
print '2' 

当我看看我的执行计划时,它说某个部分占用了“成本”的很大比例。当我将这个百分比与我的print '1'print '2'之间的经过时间进行比较时,看起来似乎没有办法百分比更接近。

它是一个安全的赌注,依靠在估计成本打印值和时间的统计数据?如果是这样,对于我来说,将重点放在印刷价值之间的时间差大于估算成本的区域是否有意义?

+0

你谈论的* *估计计划或*实际*计划? IE浏览器。 SSMS任务栏按钮“显示预计执行计划”显示的计划或在任务栏按钮“包括实际执行计划”打开时运行查询后显示的计划。 – 2010-01-22 23:47:09

+0

我正在谈论实际的执行计划,但它说“估计操作员成本”仍然 – 2010-01-22 23:55:35

回答

1

如果只打印“1”和打印“2”然后测量当您在SSMS的消息看到消息窗格中的服务器和客户端之间的输出缓冲,那么你牺牲品之间的时间。该print '1'可能不会立即发送回客户端,SqlClient中,ADO.Net和SSMS也做一些自己的缓冲。所以总的来说,你可能会在你的SSMS结果消息面板中看到'1',比实际发生时晚。更好的是从getdate()打印时间,而不是'1'。通过这种方式,您可以从公式中取出缓冲区,并且可以在消息中看到服务器执行“打印”的时间,而不是SSMS显示其输出的时间。

SET STATISTICS TIME ON总是会更准确,但有时很难understant到它到底reffers对应的语句。

我usualy做的是这样的:

declare @nowString varchar(100); 
declare @start datetime, @end datetime, @rc int, @elapsed int; 

set @start = getdate(); 

select many, fields 
from bigtable 
join manytables on condition = complex 
where matches = many 
order by wacky sort; 

set @rc = @@rowcount; 
set @end = getdate(); 
set @elapsed = datediff(ms, @start, @end); 
set @nowString = cast(varchar(100), getdate(), 14); 
raiserror(N'%s: At select No 1. Selected %i rows in %i ms', 10, 1, %nowString, @rc, @elapsed); 

set @start = getdate(); 
...next select here... 
1

这不是一个安全的赌注,因为PRINT语句被缓存起来以便输出 - 他们不是直接的。执行计划是查找性能问题的好地方,因为它可以识别最昂贵的部件的位置,并帮助识别缺失索引(例如,如果您看到表扫描)。

你也应该真正使用SQL Profiler - 监控SQL:StmtStartingSQL:StmtCompleted事件 - 这将显示每个语句需要多长时间来执行统计(StmtCompleted事件是主要的一个你感兴趣的)。

+0

是的,我最初使用了执行计划,并且把所有的东西都交给了索引查找,但仍然看到很长的执行计划。我会看看探查者说的。 – 2010-01-23 00:11:53