是一个

select *  from myView

创建视图的速度比查询本身快(以便获得相同的结果集):

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

?

我不完全清楚视图是否使用了某种缓存,使其比简单查询更快.

推荐答案

Yes、视图can分配了一个聚集索引,当它们分配聚集索引时,它们将存储临时结果,从而加快结果查询的速度.

微软自己的文档非常清楚地表明,视图可以提高性能.

首先,人们创建的大多数视图都是simple个视图,不使用此功能,因此与直接查询基表没有什么不同.简单的视图在适当的地方展开,所以有do not directly contribute to performance improvements个——这是事实.However,索引视图可以提高性能.

让我直接转到文档:

在视图上创建唯一的聚集索引后,视图的结果集将立即具体化,并保存在数据库的物理存储中,从而节省了在执行时执行此代价高昂的操作的开销.

其次,这些索引视图可以工作even when they are not directly referenced by another query次,因为优化器将在适当的时候使用它们代替表引用.

同样,文件:

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

这些文档以及演示性能改进的图表可以在here中找到.

Update 2:答案受到了批评,因为提供性能优势的是"指数",而不是"视图"然而,这很容易被驳斥.

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

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

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

Update 3:关于索引视图是否只使用放在基础表上的索引的问题出现了.也就是说,换言之:"索引视图只是标准索引的类似功能,它没有为视图提供任何新的或独特的内容."当然,如果这是真的,那么上述分析就不正确了!请允许我引用微软文档中的一段话,说明我为什么认为这种批评是无效的或不正确的:

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

加上上面关于物理存储中数据持久性的引用,以及文档中关于如何在视图上创建索引的其他信息,我认为可以肯定地说,索引视图只是一个缓存的SQL Select ,碰巧使用了主表上定义的索引.因此,我继续坚持这个答案.

Sql相关问答推荐

平均SQL

无法找到正确的SQL查询需求

用相同值更新行

有没有一种正确的方法来利用SQL UNION来从三个潜在查询中 Select 最大值?

获取每5分钟时间间隔的总和

如何在snowflake中进行SQL的反向填充

Oracle SQL根据列中的条件 Select 最大记录数

如何查询jsonb列是一个对象数组?

PostgreSQL基于2个COLS的任意组合 Select 唯一行

带上最后日期(结果)

将结果从一列转换为两行或更多

Oracle PL/SQL:解决DBMS输出大小限制的问题

优化Postgres搜索未知长度的子串

使用递归CTE在BigQuery中获取文件路径

将具有嵌套 XML 的列转换为 SQL 中的表格格式?

Grafana SQL 模板变量(值、文本)

如何从postgresql中的项目映射(关联数组)设置值?

SQL Server - 判断 ids 层次 struct 中的整数 (id)

条件前置值

并非所有变量都绑定在 PL SQL 函数中