为什么在唯一索引扫描后使用聚合运算符


15

我有一个带有唯一索引的表,该索引针对非空值进行了过滤。在查询计划中,使用了distinct。是否有一个原因?

USE tempdb

CREATE TABLE T1( Id INT NOT NULL  IDENTITY PRIMARY KEY ,F1 INT , F2 INT )
go
CREATE UNIQUE NONCLUSTERED INDEX UK_T1 ON T1 (F1,F2) WHERE F1 IS NOT NULL AND F2 IS NOT NULL 
GO
INSERT INTO  T1(f1,F2) VALUES(1,1),(1,2),(2,1)

SELECT DISTINCT   F1,F2 FROM T1 WHERE F1 IS NOT NULL AND F2 IS NOT NULL 
SELECT  F1,F2 FROM T1 WHERE F1 IS NOT NULL AND F2 IS NOT NULL  

查询计划: 在此处输入图片说明

Answers:


15

这是已知的SQL Server查询优化器限制。已报告给Microsoft,但是Connect项目(不再可用)已关闭无法修复。

此限制还有其他后果,包括我在带有过滤索引的优化器限制中所写的一些后果,摘要摘录如下:

这篇文章重点介绍了筛选器索引的两个重要的优化器限制:

  • 冗余联接谓词可能对于匹配过滤索引是必要的
  • 过滤后的唯一索引不会为优化器提供唯一性信息

在某些情况下,将冗余谓词简单地添加到每个查询中可能是可行的。另一种方法是在未索引的视图中封装所需的隐含谓词。尽管优化程序应该能够找到稍微更好的合并联接计划,但本文中的哈希匹配计划比默认计划要好得多。有时,您可能需要索引视图并使用NOEXPAND提示(对于Standard Edition实例仍然是必需的)。在其他情况下,这些方法都不适合。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.