为什么要执行表格扫描?
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