KDV*_*KDV 11 database sql-server indexing search views
我试图在SQL Server中创建一个索引视图,我想知道如果我需要索引视图列.
我问这个是因为视图由已经索引了列的表组成.
因此,如果TABLE1已将列FOO索引为非聚簇索引,是否必须将列的索引添加FOO到新创建的SQL Server视图以使用索引?
或者SQL Server是否知道在搜索视图时使用TABLE1中的索引?
视图看起来像这样
CREATE VIEW [dbo].[v_eventActivity]
WITH SCHEMABINDING
AS
SELECT ea.id,
e.eventID,
e.name,
ea.userID,
ea.activityTypeID,
ea.timeStamp,
ea.visitDuration
FROM dbo.table1 e,
dbo.table2 ea
WHERE e.eventID = ea.eventID
Run Code Online (Sandbox Code Playgroud)
我将一起搜索所有这些列.
如前所述,table1和table2都已经将这些列编入索引.
除非NOEXPAND提供提示,否则视图将仅使用表索引(此处为文档).
您可以自己测试如下:
CREATE TABLE [test].[TestTable] (
id INT IDENTITY PRIMARY KEY,
foo INT
)
CREATE NONCLUSTERED INDEX ixFoo
ON [test].[TestTable] (foo)
CREATE VIEW [test].[TestTableView] WITH SCHEMABINDING
AS
SELECT
t.id,
t.foo
FROM [test].[TestTable] t
GO
CREATE UNIQUE CLUSTERED INDEX ixFooId
ON [test].[TestTableView] (id)
CREATE NONCLUSTERED INDEX ixFooView
ON [test].[TestTableView] (foo)
Run Code Online (Sandbox Code Playgroud)
这是三个单独查询的执行计划:
SELECT
t.[id],
t.[foo]
FROM [test].[TestTable] t
ORDER BY t.[foo]
Run Code Online (Sandbox Code Playgroud)

SELECT
v.[id],
v.[foo]
FROM [test].[TestTableView] v
ORDER BY v.[foo]
Run Code Online (Sandbox Code Playgroud)

SELECT
v.[id],
v.[foo]
FROM [test].[TestTableView] v WITH (NOEXPAND)
ORDER BY v.[foo]
Run Code Online (Sandbox Code Playgroud)
