SQL Server索引视图

时间:2012-02-08 18:39:46

标签: sql-server database search indexing 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 

我将一起搜索所有这些列。

如前所述,table1和table2都已将这些列编入索引。

2 个答案:

答案 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]

The table query execution plan

SELECT
    v.[id],
    v.[foo]
FROM [test].[TestTableView] v
ORDER BY v.[foo]

The view with no hint

SELECT
    v.[id],
    v.[foo]
FROM [test].[TestTableView] v WITH (NOEXPAND)
ORDER BY v.[foo]

The view with the NOEXPAND hint

答案 1 :(得分:4)

SQL Server中的索引视图几乎没有区别,在其他地方称为物化视图。如果您的视图具有使用基表上定义的索引的基础查询,则视图上的选择也将使用索引,这不是索引视图的内容。

如果您经常使用视图并且性能很重要,您可以选择放弃更多磁盘空间(和cpu时间)并在视图上创建唯一的聚簇索引,从而在视图上启用更快的查询,因为SQL Server不必返回基表或表,并从视图索引中获取所需的一切。

看看here