【发布时间】:2018-04-01 21:06:29
【问题描述】:
我正在使用 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_Optimized 表的记录总数为 460,000 并且表中唯一 EmpId 值的总数为 26
【问题讨论】:
标签: sql-server-2012 subquery where-clause non-clustered-index filtered-index