SQL Server索引视图

问题描述:

我想在SQL Server中创建一个索引视图,我想知道如果我需要索引视图列。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

我想我知道这个问题的答案,但在写它确定,其实我不知道。好Q!知道的最好方法可能是尝试一下并看看。你也应该指定什么SS版本。 – JNK 2012-02-08 18:42:12

+0

通常,索引视图不表示整个表格,因此在特定列上表示索引通常没有意义。你有没有创建视图?你可以分享表格结构,你正在谈论的索引以及视图的定义(包括它的索引)吗? – 2012-02-08 18:44:27

+0

我确实尝试过。查询执行计划表示它确实使用原始表的索引。但我只是想确定一下。 – KDV 2012-02-08 18:44:48

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

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

看一看here

+1

如果它已经是索引视图,则不能在视图上添加唯一的聚簇索引。这就是索引视图的定义(除非唯一的聚集索引已经存在,否则不能在视图上创建非唯一索引或非聚集索引)。 – 2012-02-08 18:55:11

+1

@AaronBertrand:视图必须没有事先索引,我不暗示它有!表格可能有索引。 – Mithrandir 2012-02-08 18:57:50

+1

我读它的方式,你的描述应该像你应该添加一个独特的聚集索引到索引视图。 – 2012-02-08 19:00:17

除非提供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