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.
马上蝙蝠两件事情是惊人的我。首先是没有“工作台”这样的表格。第二个是绝对巨大数量的逻辑读数......会导致什么结果?
实际的执行计划对于两者来说都是什么样的? 'SET STATISTICS IO ON`对两者都显示了什么? – 2010-11-30 22:54:47
RE:你的提交**不存在“Worktable”这样的表。**我猜测散列连接在实际执行计划中? – 2010-11-30 23:10:22