视图是否比简单查询更快?

Joh*_*dol 330 sql sql-server performance

是一个

select *  from myView
Run Code Online (Sandbox Code Playgroud)

比查询本身更快地创建视图(为了拥有相同的resultSet):

select * from ([query to create same resultSet as myView])
Run Code Online (Sandbox Code Playgroud)

对于我来说,如果视图使用某种缓存使其比简单查询更快,那么我并不完全清楚.

Mar*_*ham 615

是的,视图可以分配聚集索引,当它们执行时,它们将存储可以加速结果查询的临时结果.

更新:至少有三个人对此投了反对票.尽管如此,我认为他们是错的; 微软自己的文档清楚地表明,Views可以提高性能.

首先,简单的视图已经扩展到位,因此不直接有助于提高性能 - 这是真的. 但是,索引视图可以显着提高性能.

让我直接进入文档:

在视图上创建唯一的聚簇索引后,视图的结果集会立即生效并保存在数据库的物理存储中,从而节省了在执行时执行此高成本操作的开销.

其次,这些索引视图即使不被另一个查询直接引用也可以工作,因为优化器会在适当时使用它们代替表引用.

再次,文档:

索引视图可以以两种方式用于查询执行.查询可以直接引用索引视图,或者更重要的是,如果查询优化器确定视图可以替换成本最低的查询计划中的部分或全部查询,则可以选择该视图.在第二种情况下,使用索引视图而不是基础表及其普通索引.查询中不需要引用视图,查询优化器在查询执行期间使用它.这允许现有应用程序从新创建的索引视图中受益,而无需更改这些应用程序.

可在此处找到此文档以及演示性能改进的图表.

更新2:答案受到批评,因为它是提供性能优势的"索引",而不是"视图".但是,这很容易被驳斥.

我们假设我们是一个小国家的软件公司; 我将以立陶宛为例.我们在全球销售软件并将我们的记录保存在SQL Server数据库中.我们非常成功,因此,在几年内,我们拥有1,000,000多条记录.但是,我们经常需要报告销售税,我们发现我们在本国只销售了100份软件.通过创建立陶宛记录的索引视图,我们可以在MS文档中描述的索引缓存中保留所需的记录.当我们在2008年运行立陶宛销售报告时,我们的查询将搜索深度仅为7的索引(Log2(100),其中包含一些未使用的叶子).如果我们在没有VIEW的情况下做同样的事情而只依赖于表中的索引,我们必须遍历索引树,搜索深度为21!

显然,View本身将为我们提供比单独使用索引的性能优势(3倍).我试图使用一个真实世界的例子,但你会注意到一个简单的立陶宛销售清单会给我们带来更大的优势.

请注意,我只是使用一个直的b树作为我的例子.虽然我相当确定SQL Server使用了一个b树的变体,但我不知道细节.尽管如此,这一点仍然存在.

更新3:关于索引视图是否仅使用基础表上的索引的问题已经出现.也就是说,换句话说:"索引视图只是标准索引的等价物,它不会为视图提供任何新的或独特的." 如果这是真的,当然,上面的分析是不正确的!让我提供Microsoft文档中的引用,该文档说明了为什么我认为这种批评无效或无效:

使用索引来提高查询性能并不是一个新概念; 但是,索引视图提供了使用标准索引无法实现的额外性能优势.

有关于物理存储和有关指标是如何在视图中创建的文档中的其他信息数据的持久以上报价在一起,我认为这是肯定地说,索引视图是不是只是一个缓存的SQL选择恰好使用主表上定义的索引.因此,我继续坚持这个答案.

  • /鼓掌@Mark坚持自己的理由并合理地争论这一点 (178认同)
  • 是的,索引视图可以显着提高性能.但索引视图不仅仅是"视图",一般来说,普通的"视图"并不比相关的查询快. (24认同)
  • 哦,伙计,我已经收到了8个这样的投票!令我惊讶的是,人们会如此迅速地投票,而不至少让查尔斯有勇气争辩他们的观点. (15认同)
  • @Charles - 如果它是索引并不重要,一个视图可以利用索引和原始查询的事实不够 (8认同)
  • 由于表只能有一个clusterdee索引,并且您可以在视图上创建单独的聚簇索引(因为聚簇索引中的字段独立地保存在索引页中),这是作弊(work-arounnd?)允许您在一个表上获得两个聚簇索引. (6认同)
  • Ryan的观点是一个很好的观点:观点的观点并不是为了提高绩效(尽管我指出了很小的改进).它是为了简化其他查询或标准化对数据的访问. (3认同)
  • 查尔斯 - 请记住数据的缓存.例如,如果我索引表中的一组字段,我会获得优势.如果我使用数据集的子集创建*View*然后创建索引,我将获得索引和视图的优势 - 因为索引现在更小. (2认同)
  • @Mark,您可以自己测试,创建索引视图,使用该视图运行查询,并检查查询执行计划。它将清楚地显示正在使用的索引。然后使用 Direct SQL 从表而不是视图运行相同的查询。执行计划将相同,使用相同的索引。 (2认同)
  • @Charles - 那我认为我们同意.事实上,这可能是MS声称索引"视图"将被甚至不使用View本身的查询使用的基础.好抓,你是对的 - 我确实误解了你.抱歉! (2认同)
  • @annakata,我的观点是,您可以独立创建索引,“在 TableName(ColumnA、ColumnB 等)上创建索引 MyIndexname”,并在所有 SQL 查询上获得完全相同的性能提升,而无需创建视图 (2认同)
  • @MarkBrittingham有关使用索引视图及其效果证明您的单词的演示,您可以包括来自https://www.simple-talk.com/sql/learn-sql-server/sql-server-indexed-views-的结果the-basics /还值得一提的是,索引视图有时可能适得其反:http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/06/02/be-ready-to-drop-your-indexed-view .aspx (2认同)
  • 我对 StackOverflow 的唯一抱怨是你只能投票一次。多年来我一直在争论这一点,无论你运行多少基准测试,或者你比较多少查询,许多人都拒绝相信这一点——这就像与不相信科学的人辩论气候变化一样。如果一个查询使用子查询在 1 分钟内运行,而另一个查询使用视图在 1 秒内运行,那么争论就结束了。感谢@MarkBrittingham 如此清楚地阐述了这些观点! (2认同)

Bra*_*adC 41

一般来说,没有.视图主要用于方便和安全,而不是用于提高速度.

也就是说,SQL Server 2000及更高版本确实有一个称为索引视图的特殊功能,可以极大地提高性能,但您必须按照一组非常具体的指南创建索引视图.

在线书籍中有关于视图分辨率的重要参考.

这篇文章描述了索引视图好处和创建:

多年来,Microsoft®SQLServer™支持创建称为视图的虚拟表的功能.从历史上看,这些观点主要用于以下目的:

  • 提供一种安全机制,将用户限制在一个或多个基表中的某个数据子集.

  • 提供一种机制,允许开发人员自定义用户如何逻辑查看存储在基表中的数据.

使用SQL Server 2000,SQL Server视图的功能得到了扩展,从而提供了系统性能优势.可以在视图上创建唯一的聚簇索引以及非聚簇索引,以提高最复杂查询的数据访问性能.在SQL Server 2000和2005中,具有唯一聚簇索引的视图称为索引视图.

  • 完全不同意......从视图中读取允许重写SQL......并且从视图中读取通常更快(比从视图的转储中读取)。 (4认同)

Rya*_*ill 13

编辑:我错了,你应该看到Marks回答上面.

我不能说从SQL Server的经验,但对于大多数数据库,答案是否定的.从性能上看,使用视图的唯一潜在好处是它可能会根据查询创建一些访问路径.但使用视图的主要原因是简化查询或标准化访问表中某些数据的方式.一般来说,您将无法获得性能优势.不过我可能错了.

我想出一个中等更复杂的例子,并自己去看看时间.

  • 视图的另一个原因是辅助基于角色的模型中的访问控制 (2认同)

Cha*_*ana 13

至少在SQL Server中,查询计划基于查询/视图参数存储在计划缓存中,用于视图和普通SQL查询.对于两者而言,当它们在未使用足够长的时间段时从缓存中删除,并且对于其他一些新提交的查询需要空间.之后,如果发出相同的查询,则重新编译它,并将计划放回缓存中.所以不,没有区别,因为您正在重复使用相同的SQL查询和具有相同频率的相同视图.

显然,一般来说,一个视图,就其本质而言(有人认为它经常被足够使用以使其成为一个视图)通常比任何任意SQL语句更有可能被"重用".


Otá*_*cio 5

如果创建实例化视图(具有模式绑定),则可能会更快。非实例化视图的执行与常规查询一样。


E.J*_*nan 5

我的理解是,不久前,视图会更快,因为 SQL Server 可以存储执行计划,然后只需使用它,而不是试图在运行中找出一个。我认为现在的性能提升可能不像以前那么好,但我不得不猜测使用该视图会有一些微小的改进。


小智 5

对于 SQL Server,视图绝对优于嵌套查询。在不知道为什么它更好的情况下(直到我阅读了 Mark Brittingham 的帖子),我运行了一些测试并且在使用视图与嵌套查询时经历了几乎令人震惊的性能改进。连续运行每个版本的查询数百次后,查询的视图版本完成了一半的时间。我会说这对我来说已经足够了。