与查询相比的视图性能(使用联合语句)

Posted

技术标签:

【中文标题】与查询相比的视图性能(使用联合语句)【英文标题】:Performance of a view compared to a query (with union statements) 【发布时间】:2010-08-30 08:04:10 【问题描述】:

我需要经常运行一个查询来聚合来自不同表的数据,比如

select
Name, Code, Date From TableA
union
select
Surname, TheCode, TheDate From TableB
union
[...] -- this stands for some more select statements
union
select
NickName, MyCode, getdate() from tableC

(这个例子很简单,但就像这样:我无法重构数据库以将我需要的所有数据放在一个表中!)。

此查询可以返回 100.000 条记录,即使由于 WHERE 条件通常会返回 400-500 条记录。

我正在考虑使用视图来简化查询,但这有意义吗?查询视图更快是因为视图是预先计算的(我不确定)还是视图在查询时执行?我的意思是:如果 10 个用户请求相同的数据,对带有连接的表运行 10 个查询,或者对一个视图运行 10 个查询,是一样的还是有视图更好? (我的意思是如果视图只执行一次更好,如果不是完全一样)。

此外,我无法使用索引视图,因为我使用的是UNION STATEMENTS。

视图的优点是我还可以轻松地对视图执行选择 count(*),而要对表执行此操作,我应该编写几乎 2 个不同的查询:一个(我上面写的那个)用于获取记录,另外一个(修改上面的一个)用于计数。

【问题讨论】:

【参考方案1】:

您没有提及您拥有哪个版本的 MSSQL,但您可能正在寻找“分区视图”甚至“分区表”(有关完整详细信息,请参阅联机丛书)。它们是否对您有任何好处取决于您拥有多少数据,而测试将是找出答案的最佳方式。

为了回答您的一般问题,当您在查询中有视图时,在查询时视图名称将替换为视图定义,因此 MSSQL 无论如何都不会“看到”视图。索引视图是个例外,其中查询计划器可以从视图中获取数据,而不是从表中获取数据。但是索引视图也有缺点。 Books Online 有很多相关信息:查找“视图分辨率”、“解析视图索引”、“创建索引视图”等。

【讨论】:

仅供参考,版本也相关:分区表仅在企业版(和开发版,这是同一件事,不同许可)中可用。【参考方案2】:

未索引视图的“预先计算”性质基本上意味着服务器将有查询计划已经在缓存中,而选择语句可能不会在查询缓存中(通常不是问题)。

您可能会考虑将您的查询放在一个函数中并直接调用它来获取记录,或者使用稍微不同的 select 语句进行计数。在这种情况下,我认为视图没有太大优势。

【讨论】:

【参考方案3】:

使用UNION ALL,它不做DISTINCT(UNION 做)

It 也这么说。

【讨论】:

以上是关于与查询相比的视图性能(使用联合语句)的主要内容,如果未能解决你的问题,请参考以下文章

SQL 语句与性能之联合查询和联合分类查询

视图查询性能的新认识

提高系统性能——对SQL语句优化的思考

查询性能优化

mysql学习之路_联合查询与子查询

与 Room 相比,SQLDelight 性能较慢