mor*_*hai 14 sql-server optimization filtered-index
我有一个表,其中有一个针对不可为空值过滤的唯一索引。在查询计划中使用了 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
Run Code Online (Sandbox Code Playgroud)
查询计划:

Pau*_*ite 16
这是已知的 SQL Server 查询优化器限制。已向 Microsoft 报告,但连接项(不再可用)已关闭,无法修复。
此限制还有其他后果,包括我在Optimizer Limitations with Filtered Indexes 中写的一些内容,摘要如下:
这篇文章强调了过滤索引的两个重要优化器限制:
- 可能需要冗余连接谓词来匹配过滤索引
- 过滤的唯一索引不向优化器提供唯一性信息
在某些情况下,简单地向每个查询添加冗余谓词可能是可行的。另一种方法是将所需的隐含谓词封装在未索引的视图中。这篇文章中的哈希匹配计划比默认计划好得多,即使优化器应该能够找到稍微更好的合并连接计划。有时,您可能需要索引视图并使用
NOEXPAND提示(无论如何标准版实例都需要)。在其他情况下,这些方法都不适合。
| 归档时间: |
|
| 查看次数: |
351 次 |
| 最近记录: |