我有一个很大的问题,我想逐一改进它,但是由于缓存机制和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。
所以我再也无法在两个查询之间进行比较。如何解释结果?我找错了地方吗?我怎样才能比较上面这两个简单的查询?
答案 0 :(得分:1)
答案 1 :(得分:1)
运行set statistics time on
和set 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