2010-11-30 36 views
2

什么会使一张桌子比另一张桌子慢得多?可能比较容易,只是说明:什么会使桌子“变慢?”

查询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 

表的结构是相似的,而我访问ext_document_detail具有非常相似的加入与memo_clt表相比。然而,第二个查询需要40秒,而另一个需要0秒。

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

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

编辑:由于马丁问,这里有SET统计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. 

马上蝙蝠两件事情是惊人的我。首先是没有“工作台”这样的表格。第二个是绝对巨大数量的逻辑读数......会导致什么结果?

+0

实际的执行计划对于两者来说都是什么样的? 'SET STATISTICS IO ON`对两者都显示了什么? – 2010-11-30 22:54:47

+0

RE:你的提交**不存在“Worktable”这样的表。**我猜测散列连接在实际执行计划中? – 2010-11-30 23:10:22

回答

2

这不是表格本身造成的速度差异。它是查询表上的连接和支持索引的结构。

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

一个很好的开始就是看看你是否有任何表扫描。如果你有这些,可以优化你可能会看到性能的增加。

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