【问题标题】:Why would you want to put an index on a view?为什么要在视图上放置索引?
【发布时间】:2011-06-11 20:53:27
【问题描述】:

Microsoft SQL Server 允许您向视图添加索引,但您为什么要这样做呢?

我的理解是视图实际上只是一个子查询,也就是说,如果我说 SELECT * FROM myView,我实际上是在说 SELECT * FROM (myView's Query)

似乎基础表上的索引将是最重要的索引。那么为什么要在视图上设置一个单独的索引呢?

【问题讨论】:

    标签: sql sql-server database-design indexing


    【解决方案1】:

    Microsoft SQL Server 允许您向视图添加索引,但您为什么要这样做呢?

    加快查询速度。

    我的理解是视图实际上只是一个子查询,也就是说,如果我说 SELECT * FROM myView,我实际上是在说 SELECT * FROM (myView's Query)

    并非总是如此。

    通过在视图上创建聚集索引,您可以实现视图,并且对基础表的更新会物理地更新视图。针对此视图的查询可能会也可能不会访问基础表。

    并非所有视图都可以编入索引。

    例如,如果您在视图中使用GROUP BY,为了使其可索引,它应该包含COUNT_BIG,并且其中的所有聚合函数都应该分布在UNION ALL 上(仅限SUMCOUNT_BIG实际上是)。这是索引可维护所必需的,并且对基础表的更新可以及时更新视图。

    【讨论】:

    • 也不能索引调用视图的视图。
    • @HLGEM: 是的,2465 还有更多限制,我在这里没有提到。
    • 我以为不止这些。
    • @HLGEM:好吧,也许是2466,但我不确定。
    【解决方案2】:

    您在视图上创建索引的原因与在基表上的原因相同:提高对该视图的查询性能。这样做的另一个原因是实现一些您无法针对基表实现的唯一性约束。不幸的是,SQL Server 不允许在视图上创建约束。

    【讨论】:

      【解决方案3】:

      以下链接提供的信息比我能说的更好,尤其是在性能提升部分。希望对你有帮助

      http://technet.microsoft.com/en-us/library/cc917715.aspx

      【讨论】:

        【解决方案4】:

        如果视图被索引,那么任何可以仅使用索引来回答的查询将永远不需要引用基础表。这可以极大地提高性能。

        本质上,当您更新基础表时,数据库引擎会维护查询的“已解决”版本(或者更确切地说,查询的索引),然后尽可能使用该已解决版本而不是原始表。

        这是数据库日志中的一个很好的article

        【讨论】:

        • 这里有一个关于索引视图的好文档:msdn.microsoft.com/en-us/library/ms187864.aspx
        • +1:人们认为非物化视图存储信息,但实际上只有物化视图(在受支持的情况下 - IE:不是 MySQL 或 PostgreSQL)视图可以这样做。
        猜你喜欢
        • 1970-01-01
        • 2021-12-17
        • 2016-09-29
        • 2013-02-02
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多