与查询相比的视图性能(使用联合语句)
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 也这么说。
【讨论】:
以上是关于与查询相比的视图性能(使用联合语句)的主要内容,如果未能解决你的问题,请参考以下文章