非聚集过滤索引中 WHERE 子句中的子查询

Subquery in the WHERE clause in Nonclustered Filtered Index

我正在使用 SSMS 2016 并尝试在 JOIN 和 Where 条件中使用的两列上创建过滤的非聚集索引。过滤索引时是否允许在WHERE子句中使用子查询?下面是对应的例子:

CREATE NONCLUSTERED INDEX [ncIX_MyId_&_EmpId_on_MyDB_Mytbl_optimized] 
ON MyDB.dbo.[Mytbl_Optimized] ([MyId], [EmpId])

WHERE [MyId] IN 
(SELECT DISTINCT Mytbl.[EmpId] FROM MyDB.dbo.Mytbl_Optimized AS t1 (NOLOCK) 
            LEFT OUTER JOIN AnotherDB.dbo.Another-tbl AS t2 WITH (NOLOCK)
            ON t1.EmpId = t2.EmpId)

--The SSMS compiler says incorrect syntax near 'IN'... 

但是当我将子查询替换为显式值时,例如:

WHERE [MyId] IN (1,2) -- it works fine. 

我的目标是提高未索引视图的性能(使此视图索引不是一个选项,因为它每 5 分钟更新一次)。在该视图中,上面的 select 语句用作归档结果集:

CREATE VIEW 
AS 
col1,
Col2,
(SELECT DISTINCT Mytbl.[EmpId] FROM MyDB.dbo.Mytbl_Optimized AS t1 (NOLOCK) 
            LEFT OUTER JOIN AnotherDB.dbo.Another-tbl AS t2 WITH (NOLOCK)
            ON t1.EmpId = t2.EmpId 
WHERE AnotherDB.dbo.Table3.MyId = t1.MyId
FOR XML PATH('')) AS MyConcatenatedID
FROM AnotherDB.dbo.Table3 

注:tbl_Optimizedtable中的记录总数为460,000条 table 中唯一 EmpId 值的总数为 26

除非我误读 this article,过滤后的索引不会帮助您查看。

此外,我认为您不能使用子查询来定义索引中包含的内容。根据我的研究和测试,IN 子句中的列表必须是显式的。