2010-01-15 35 views
0

我有一个很大的查询,我试图改进它的一部分,但由于缓存机制和t-sql代码的简单性,我没有可靠的环境来测试速度。我想要提高速度的查询全部持续大约1或2秒,所以我看不出明显的差别。为每个比较创建虚拟数据需要太多时间。你建议我做什么?我正在使用我的公司数据库,所以每次删除缓存都可能是有害的,我猜。SQL Server如何比较简单查询的速度

编辑: 看完所有的评论后,我做了一些评论,并有一些想法。但在统计数据中查看所有这些值是否正是我想要的?

这里是我所面临的问题:

执行计划:首先,我运行一些查询,看着执行计划,在顶部 - 查询成本(相对于批)我不能得到一个价值不是0.00%。即使我的查询持续超过1分钟。只有我得到的是0.00%。并根据图表,所有的值为0%

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

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

,第二个是评论的免费版本。

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

这里从数据库统计我的结果,第一次查询:。

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

当你在开始时使用类似%的查询时,查询将扫描整个表以比较主键的内容。不幸的是,它不能使用任何索引。这就是为什么逻辑读取总是相同的原因,无论您访问整个表格还是添加类似的语句。 你为什么要在主键上做一个类似的事情?是不是ht_atk就像是在主键或类似的连接类别? – 2010-01-18 16:30:29

回答

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. 

尽量把表中的一些数据,并检查扫描计数和逻辑读取大的数字。

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

+0

当我尝试比较我在更新我的问题时提到的两个简单查询的速度时,这些行彼此没有区别。 – stckvrflw 2010-01-18 14:36:35

+0

查看问题的评论... – 2010-01-18 16:35:13

1

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

这样可以让您调整要优化的零件。

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

+0

“这样可以让你完成你应该优化的零件。” “让你归零”是什么意思?我不是英语母语的人,所以我没有得到。 我会问你的另一件事是DB Stats。我想你会在数据库统计中说明“服务器回复上的累积等待时间”部分。但每次执行我的代码时它都会更改。例如:在服务器 累计等待时间回复 3,30529e + 006 2,75441e + 006 2,06581e + 006 1,83627e + 006 1,27127e + 006 我应该如何解释这些值?或者我看错了地方? 我也没有得到你最后一句话。 – stckvrflw 2010-01-18 11:12:24

+0

零点意味着您将能够找到问题的确切区域。另外,不要看“累积等待时间”。查看查询的哪些部分占用了最大的百分比 - 这就是花费的时间。 – Oded 2010-01-18 12:14:46

+0

你好,我更新了这个问题。在哪里可以通过零件视图查看该部分。它在数据库统计中?你可以查看我上面的数据库统计。 – stckvrflw 2010-01-18 14:34:55

0

好方法太看执行平淡。它告诉我们如何执行查询以及大部分时间需要什么。你甚至可以决定在该基础上创建索引。它特别适用于大型查询。 SQLServer大多数时候都会找到执行查询的最佳方式,但是您可以通过为其提供在WHERE和JOIN语句中使用的字段索引来改进它。如果您无法读取像估计成本和时间图表一样的平滑执行,您可以从MSDN详细阅读它。

+0

在执行计划中,一切似乎都是%0。即使我的查询持续大约1分钟,查询成本(相对于批次)仍然为%0。这是一个问题btw? – stckvrflw 2010-01-18 12:37:02

-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 
+0

计数器总是给出不同的结果。但是我想看到的是,当查看两个查询时,%100的真实结果。 – stckvrflw 2010-01-18 14:37:55

0

在查询分析器去查询>包括实际的执行计划和查询>包括客户端统计。

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

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

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