非聚集过滤索引中 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 子句中的列表必须是显式的。
我正在使用 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 子句中的列表必须是显式的。