使用视图提高查询性能

Posted

技术标签:

【中文标题】使用视图提高查询性能【英文标题】:Improving query performance by using views 【发布时间】:2010-09-14 18:17:04 【问题描述】:

我在 SQL Server 数据库中有一个包含 10+ 百万条记录的大表。该表包含美国所有 50 个州的某些类型的数据。因此,如果我从这个表中创建 50 个视图,每个状态一个,从我的应用程序进行查询的性能会得到改善吗?其他建议?

【问题讨论】:

【参考方案1】:

没有。视图是一个扩展的宏,因此相同的表最终会出现在计划中。

除非它被编入索引。 50 个索引视图很可能是多余的。

如果您在 5000 万行时性能很慢(实际上并没有那么多),那么这就是索引问题。

编辑:

首先,我会使用weighted missing index dmv query 来查看您在哪里获得最大的收益

【讨论】:

【参考方案2】:

普通(非索引)视图无法提高性能 - 它们可以被视为 SELECT 查询的“速记”或“别名”,因为它们下面没有物理结构。

索引视图是另一种野兽,但到目前为止您似乎不需要它们。

您需要在表上创建适当的索引,并可能重新设计表(例如,将其拆分为多个表)。

如果您需要更具体的建议,请在此处发布表结构和一些典型查询示例(您想要优化的查询)。

【讨论】:

【参考方案3】:

你在正确的轨道上:

首先确保您索引数据以反映您需要快速的读取。然后,由于过滤 确实 使其更快,我会考虑通过允许通过存储过程(使用状态参数)访问数据来过滤状态。

【讨论】:

【参考方案4】:

如果您的执行计划中有正确的索引和使用情况,那么最大的问题是内存缓存的数量和磁盘的读取速度。创建视图不会解决任何问题,它仍然是相同磁盘/缓存上的相同数据,只是引用它的不同逻辑方式。

【讨论】:

@Denis,您将实现计算数据以节省每次计算的时间,操作只是希望更快地访问他们拥有的东西,因此视图没有任何帮助 每个状态的索引视图将充当分区,即删除与创建视图的状态无关的所有数据,显然可以加快速度。【参考方案5】:

一个简单的建议:

use [YourDataBase]
select * from sys.dm_db_missing_index_details as ddmid

【讨论】:

【参考方案6】:

这是一个非常小的数据库,如果您遇到性能问题,您的索引错误,您的数据库设计不好,或者您设计的查询性能不佳。如果设计得当,SQL Server 可以毫不费力地处理数万亿条记录。

如果您使用调用视图的视图,视图 BTW 可能会成为性能杀手。

【讨论】:

以上是关于使用视图提高查询性能的主要内容,如果未能解决你的问题,请参考以下文章

如何提高基于视图的查询性能?

索引视图以提高 SQL Server 上多个连接的性能

提高 Oracle 视图的性能

基于函数的索引没有提高查询性能

JAVA进阶:提高SQL性能的几种方法

提高从 View 获取数据的查询性能