Sql server 2005 什么能组成一张桌子;慢;

Sql server 2005 什么能组成一张桌子;慢;,sql-server-2005,tsql,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='

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

问题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
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.
这些表的结构是相似的,我访问ext_document_详细信息时使用的联接与memo_clt表非常相似。然而,第二个查询需要40秒,而另一个查询需要0秒

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

那么为什么这里的速度不同呢

编辑:既然马丁问了,下面是设置统计IO的结果 问题1:

问题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
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
为这两个选项显示了什么?RE:您的命令没有“Worktable”这样的表。我猜散列联接在实际执行计划中?我想我应该早点查看执行计划。。。注意到有一个谓词隐式地将doc_ref转换为int。这使我意识到doc_ref被存储为varchar(50)。将查询更改为将c.record转换为varchar,现在它的执行速度与另一个查询一样快。谢谢