SQL Server索引视图

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都已经将这些列编入索引.

Liq*_*ony 7

除非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)

带有NOEXPAND提示的视图


Mit*_*dir 5

SQL Server 中的索引视图与别处所谓的物化视图几乎没有区别。如果您的视图具有使用在基表上定义的索引的基础查询,则视图上的选择也将使用索引,这不是索引视图的意义。

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

看看这里