为什么要执行表格扫描?

SELECT X.ID, X.Field4
FROM 
        #TaxInvoiceData T
INNER JOIN
        xxx X
        ON  T.Id = X.Id
        AND Field2 = @VAR     
        AND Field3 = 'S'

当我在表X上运行查询全表扫描时,我不明白为什么,因为表X的主键是

ID INT ASC
Field3 CHAR(2) ASC
Field2 DATETIME ASC  Unique Non-clustered

还有一个索引

Field2 DATETIME ASC  Non-Unique Non-clustered

正在做

SELECT ID
FROM xxx
WHERE 
    Field2 = @VAR   
AND Field3 = 'S'

索引是否找到

提前致谢。


简短的回答:因为优化器认为它会更快。

但是,让我们尝试阅读优化器的思想。

既然你没有提供完整的表格模式,我会假设在xxx.ID上有一个聚集索引,并且#TaxInvoiceData是一个堆。 您期待的计划是在#TaxInvoiceData每一行中探索PK索引,但是您选择xxx.Field4 ,这需要为每个匹配查找书签。 这可能导致29,000个随机I / O请求。 哎哟。

反之,则SQL Server可以(显然是要)只是执行I / O执行表扫描,并可能做对早日哈希匹配更有效的顺序更大量的#TaxInvoiceData

所以,你可以做什么? 你可以创建一个包含Field4的覆盖索引。 或者你可以使用索引和加入提示来强制你正在寻找的计划(但我怀疑绩效不会如你所愿)。 这个查询的使用频率是否足够高,以至于它给你的应用程序性能带来问题,或者你只是想从原理上消除表扫描? 如果是后者,你可能会发现摆脱扫描的开销并不值得。


编辑:

既然你已经提到过表上没有聚集索引,这也可能会影响索引的有效查找。 除非此表格看到插入活动过重,否则请考虑将您的PK更改为聚簇。 只有这一点可能会改变计划,即使它不会加速其他业务,也可能因为开销减少而加速。


也许重写查询会有所帮助:

SELECT X.ID, X.Field4 
FROM  xxx X,  #TaxInvoiceData T 
WHERE X.Id = T.Id        
AND X.Field2 = @VAR              
AND X.Field3 = 'S' 
链接地址: http://www.djcxy.com/p/10171.html

上一篇: Why is a table Scan being performed?

下一篇: Combining RSpec filters?