什么会让桌子“慢”?

时间:2010-11-30 22:52:19

标签: sql-server-2005 tsql

什么会使一张桌子比另一张桌子慢得多?可能最容易说明:

查询1:

select top 1000 *
from call c
JOIN call_task ct ON c.call_no=ct.call_no
LEFT JOIN memo_clt m ON m.doc_ref=ct.record AND m.doc_type='CLT' AND m.line_no=1
LEFT JOIN memo_clt m2 ON m2.doc_ref=ct.record AND m2.doc_type='CLT' AND m2.line_no=2

查询2:

select top 1000 *
from call c
LEFT JOIN ext_document_detail edd   ON edd.doc_type='CLH' 
                                            AND edd.doc_ext_no=21
                                            AND edd.doc_ref=c.record
LEFT JOIN ext_document_detail edSource  ON edSource.doc_type='CLH'
                                                AND edSource.doc_ext_no=22
                                                AND edSource.doc_ref=c.record

表的结构是类似的,与memo_clt表相比,我使用非常相似的连接访问ext_document_detail。然而,第二个查询需要40秒,而另一个需要0秒。

两者都在我用于连接的三个键上有一个聚簇索引。 memo_clt表在它的记录列上有一个非聚集索引但是...这是我能发现的唯一区别,我认为它不会产生很大的不同。

那么为什么这里的速度差异呢?

编辑:自马丁问以来,这里是SET STATISTICS IO ON的结果 查询1:

Table 'memo_clt'. Scan count 2000, logical reads 6454, physical reads 0, read-ahead reads 0, lob logical reads 2385, lob physical reads 0, lob read-ahead reads 0.
Table 'call_task'. Scan count 1, logical reads 39, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'call'. Scan count 1, logical reads 25, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

查询2:

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'ext_document_detail'. Scan count 1001, logical reads 1507004, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'call'. Scan count 1, logical reads 24, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

马上就有两件事让我感到震惊。首先是没有“工作台”这样的表格。第二个是绝对大量的逻辑读取......会导致什么?

1 个答案:

答案 0 :(得分:2)

表格本身并不是导致速度差异的原因。它是被查询表上的连接和支持索引的结构。

为了给你一个很好的理由,我需要看到你的执行计划。我怀疑一个查询比另一个更好地利用索引。

一个好的起点是看你是否有任何表扫描。如果您有这些并且可以优化,您可能会看到性能提升。

我会给this article一个很好的阅读。这绝对值得检查和理解..