【问题标题】:SQL Server indexed viewsSQL Server 索引视图
【发布时间】:2012-03-01 05:57:20
【问题描述】:

我正在尝试在 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 都已经为这些列建立了索引。

【问题讨论】:

  • 我以为我知道这个问题的答案,但在书面上它确定事实上我不知道。好Q!最好的了解方法可能是尝试并查看。你也应该指定什么 SS 版本。
  • 通常索引视图并不代表整个表,因此在特定列上表示索引通常没有意义。你创建视图了吗?你能分享一下表结构、你说的索引以及视图的定义(包括它的索引)吗?
  • 我确实试过了。查询执行计划说它确实使用了原始表的索引。但我只是想确定一下。
  • 执行计划会知道 ;)
  • @Yuck 好吧,我开始回答,但意识到优化器可以机会主义地使用索引视图索引,所以它可能也可以用于表,但后来我意识到我不确定所以希望亚伦或聪明的人会回答。

标签: sql-server database search indexing views


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    看看here

    【讨论】:

    • 如果已经是索引视图,则不能在视图上添加唯一聚集索引。这就是索引视图的定义(您不能在视图上创建非唯一或非聚集索引,除非已经存在唯一聚集索引)。
    • @AaronBertrand:视图必须没有先前的索引,我并不暗示它有!表可能有索引。
    • 按照我的阅读方式,您的描述使您应该向索引视图添加唯一的聚集索引。
    • 抱歉,这是个误会,事实上您就是这样做的,您在没有索引的情况下获得了一个漂亮干净的视图并定义了一个单一的聚集唯一索引!那 MAKES 是一个索引视图!这是在例如完成的Oracle 相当多,至少我以前在某些情况下会这样做。
    • 是的,我很确定我们了解索引视图的工作原理。我只是指出您的描述可能对某些人具有误导性和混淆性,因此想澄清您不能将聚集索引添加到索引视图中。
    猜你喜欢
    • 2011-02-16
    • 2011-07-16
    • 2013-04-25
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2021-04-24
    • 2023-03-16
    相关资源
    最近更新 更多