视图比简单查询快吗?

只谈情不闲聊 提交于 2020-03-11 21:31:09

是一个

select *  from myView

创建视图的速度比查询本身快(以便具有相同的resultSet):

select * from ([query to create same resultSet as myView])

对于视图来说,是否使用某种类型的缓存使其比简单查询更快,这对我来说还不是很清楚。


#1楼

一切都取决于情况。 MS SQL索引视图比普通视图或查询快,但是索引视图不能在镜像数据库环境(MS SQL)中使用。

任何形式的循环中的视图都会导致严重的减速,因为每次在循环中调用该视图时都会重新填充该视图。 与查询相同。 在这种情况下,使用#或@来保存要循环通过的数据的临时表比视图或查询要快。

因此,这完全取决于情况。


#2楼

从视图或表中选择不会有太大的意义。

当然,如果View没有不必要的联接,字段等。您可以检查用于提高View性能的查询,联接和索引的执行计划。

您甚至可以在视图上创建索引,以加快搜索需求。 http://technet.microsoft.com/zh-CN/library/cc917715.aspx

但是,如果您要像'%...%'一样进行搜索,则sql引擎将无法从文本列索引中受益。 如果您可以强迫用户进行“ ...%”之类的搜索,那将很快

提到在ASP论坛上的答案: https : //forums.asp.net/t/1697933.aspx? +h+is+faster+when+using+SELECT+query+VIEW+or+Table+


#3楼

是的 ,可以为视图分配聚簇索引,并且在这样做时,它们将存储临时结果,从而可以加快结果查询的速度。

更新:至少三个人对我投了反对票。 出于所有应有的尊重,我认为它们是错误的。 Microsoft自己的文档非常清楚地表明Views可以提高性能。

首先,将简单的视图扩展到适当的位置,因此不会直接有助于提高性能-确实如此。 但是,索引视图可以大大提高性能。

让我直接转到文档:

在视图上创建唯一的聚集索引之后,视图的结果集将立即实现并保存在数据库的物理存储中,从而节省了在执行时执行此昂贵操作的开销。

其次, 即使没有被另一个查询直接引用 ,这些索引视图也可以工作,因为优化程序将在适当的时候使用它们代替表引用。

同样,文档:

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

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

更新2:批评该答案的依据是,提供性能优势的是“索引”,而不是“视图”。 但是,这很容易被驳斥。

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

显然,与单独使用索引相比,视图本身将为我们提供3倍的性能优势。 我尝试使用一个实际示例,但您会注意到,简单的立陶宛销售清单将为我们提供更大的优势。

请注意,我只是在示例中使用直的b树。 虽然我相当确定SQL Server使用了b树的某种变体,但我不知道细节。 尽管如此,这一点仍然成立。

更新3:关于索引视图是否仅使用放置在基础表上的索引的问题已经提出。 也就是说,换句话说:“索引视图仅相当于标准索引,它对视图不提供任何新的或唯一的。” 当然,如果这是真的,那么以上分析将是错误的! 让我提供Microsoft文档中的一句话,以说明为什么我认为这种批评无效或正确:

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

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


#4楼

编辑:我错了,你应该看到马克斯回答上面。

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

我想出一个稍微复杂些的示例,自己动手看一下。


#5楼

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!