我正在尝试在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
我将一起搜索所有这些列。
如前所述,table1和table2都已将这些列编入索引。
答案 0 :(得分:7)
除非提供NOEXPAND
提示,否则视图将仅使用表索引(文档here)。
您可以按照以下方式自行测试:
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)
以下是三个单独查询的执行计划:
SELECT
t.[id],
t.[foo]
FROM [test].[TestTable] t
ORDER BY t.[foo]
SELECT
v.[id],
v.[foo]
FROM [test].[TestTableView] v
ORDER BY v.[foo]
SELECT
v.[id],
v.[foo]
FROM [test].[TestTableView] v WITH (NOEXPAND)
ORDER BY v.[foo]
答案 1 :(得分:4)
SQL Server中的索引视图几乎没有区别,在其他地方称为物化视图。如果您的视图具有使用基表上定义的索引的基础查询,则视图上的选择也将使用索引,这不是索引视图的内容。
如果您经常使用视图并且性能很重要,您可以选择放弃更多磁盘空间(和cpu时间)并在视图上创建唯一的聚簇索引,从而在视图上启用更快的查询,因为SQL Server不必返回基表或表,并从视图索引中获取所需的一切。
看看here。