SQL Server,如何比较简单查询的速度

时间:2010-01-15 16:02:49

标签: sql-server tsql comparison performance

我有一个很大的问题,我想逐一改进它,但是由于缓存机制和t-sql代码的简单性,我没有可靠的测试速度环境。我想提高速度的查询都持续了大约1或2秒,所以我看不清楚这些差异。为每个比较创建虚拟数据需要花费太多时间。你建议我做什么?我正在使用我的公司数据库,因此我想每次删除缓存都是有害的。

编辑: 在阅读完所有评论之后,我做了一些努力,我有了一些想法。但是,在统计数据中查找所有这些值确实是我想要的吗?

以下是我遇到的问题:

执行计划:首先我运行一些查询并查看执行计划,在顶部 - 查询成本(相对于批处理)我无法获得0.00%以外的值。甚至我的查询持续时间超过1分钟。我得到的只是0.00%。在图表下,所有值均为0%

数据库统计。现在我正在测试两个查询。其中之一是

SELECT * FROM My_TABLE / * WHERE
my_primarykey LIKE'%ht_atk%' * /

第二个是免费评论版。

SELECT * FROM My_TABLE WHERE
my_primarykey LIKE'%ht_atk%'

这里是我对DB Statistics的结果,首先查询:。

Application Profile Statistics      
  Timer resolution (milliseconds)   0   0
  Number of INSERT, UPDATE, DELETE statements   0   0
  Rows effected by INSERT, UPDATE, DELETE statements    0   0
  Number of SELECT statements   2   2
  Rows effected by SELECT statements    16387   15748,4
  Number of user transactions   7   6,93182
  Average fetch time    0   0
  Cumulative fetch time 0   0
  Number of fetches 0   0
  Number of open statement handles  0   0
  Max number of opened statement handles    0   0
  Cumulative number of statement handles    0   0

Network Statistics      
  Number of server roundtrips   3   3
  Number of TDS packets sent    3   3
  Number of TDS packets received    252 242,545
  Number of bytes sent  868 861,091
  Number of bytes received  1,01917e+006    981160

Time Statistics     
  Cumulative client processing time 0   0,204545
  Cumulative wait time on server replies    25  10,0455

第二次查询:

Application Profile Statistics      
  Timer resolution (milliseconds)   0   0
  Number of INSERT, UPDATE, DELETE statements   0   0
  Rows effected by INSERT, UPDATE, DELETE statements    0   0
  Number of SELECT statements   2   2
  Rows effected by SELECT statements    14982   15731,3
  Number of user transactions   5   6,88889
  Average fetch time    0   0
  Cumulative fetch time 0   0
  Number of fetches 0   0
  Number of open statement handles  0   0
  Max number of opened statement handles    0   0
  Cumulative number of statement handles    0   0

Network Statistics      
  Number of server roundtrips   3   3
  Number of TDS packets sent    3   3
  Number of TDS packets received    230 242,267
  Number of bytes sent  752 858,667
  Number of bytes received  932387  980076

Time Statistics     
  Cumulative client processing time 1   0,222222
  Cumulative wait time on server replies    8   10

每次执行时,值都是随机变化的,我无法很好地了解哪个查询更快。

最后,当我这样做时:

SET STATISTICS TIME ON SET STATISTICS IO ON

对于两个查询,结果都是相同的。

表'my_TABLE'。扫描计数1,逻辑读取682,物理读取0,预读读取0。

所以我再也无法在两个查询之间进行比较。如何解释结果?我找错了地方吗?我怎样才能比较上面这两个简单的查询?

5 个答案:

答案 0 :(得分:1)

使用query analyzer查找查询的昂贵部分(这取决于数据库统计信息,因此请使用代表性数据)。

这将让您了解应优化的部分。

尝试使用秒表计时或查看结果返回SSMS所需的时间最多只是猜测。

答案 1 :(得分:1)

运行set statistics time onset statistics io on,然后在文本模式下运行大查询。您可以在要优化的查询的每个部分之后放置一些打印件。

您将获得以下行:

Table 'Table'. Scan count 1, logical reads 10, physical reads 0, read-ahead reads 0, lob    logical reads 387, lob physical reads 0, lob read-ahead reads 0.

尝试在表中放入一些数据并检查扫描计数和大数字的逻辑读取。

您还可以检查实际执行计划并搜索任何聚集索引扫描。这可能表示某些表中缺少索引。

答案 2 :(得分:0)

好的方法也是执行简单。它告诉了很多关于查询将如何执行以及大多数时间需要执行的操作。您甚至可以决定在此基础上创建索引。它非常有用,特别是大型查询。 SQLServer大多数时候都会找到执行查询的最佳方法,但是您可以通过在WHERE和JOIN语句中使用字段索引来改进它。如果您无法读取执行简单,就像估计成本和时间的图表,您可以从MSDN详细阅读它。

答案 3 :(得分:0)

在查询分析器中,转到查询>包括实际执行计划和查询>包括客户统计信息。

使用执行计划确定查询中成本最高的部分。当您鼠标悬停或单击任何节点时,它将显示一组统计信息。尝试查看是否可以重做连接或过滤器以减少返回的行数。

使用客户端统计信息比较两个查询。每次运行查询时,它都会向客户端统计信息页面添加一个新列。您想查看底部组:时间统计。

我知道其中一些是显而易见的,但这里有一些减少负载的一般提示: - 仅返回您需要的列。有时人们返回所有列,或者他们用于编码的一些标识符列,但最终用户不需要。 - 对于每个表 - 减少返回的行数。 - 如果不需要,请尽量不要使用临时表。这会导致“双重下降”,或者多次查询同一个非常大的表。

答案 4 :(得分:-1)

正如@affan所说,最好的方法是使用执行计划提供的信息。但你可以随时设置一个简单的计数器,其代码如

IF @debug > 0 BEGIN
    DECLARE @now DATETIME;
    SET @now = CURRENT_TIMESTAMP;
END

IF @debug > 0 BEGIN
    SELECT DATEDIFF(ms,@now,CURRENT_TIMESTAMP)/1000.0 AS Runtime;
END