Sql server 与查询(使用union语句)相比,视图的性能

Sql server 与查询(使用union语句)相比,视图的性能,sql-server,sql-server-2008,views,Sql Server,Sql Server 2008,Views,我需要经常运行一个查询来聚合来自不同表的数据,比如 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 (这个例子很简单,但它是这样的:我不能重构数据库

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

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
语句


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


同样如此。

使用
UNION ALL
,它不做区分(UNION做它)


同样如此。

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


您可以考虑将查询放在函数中,并将其称为Primes以获取记录,或者使用与计数相对应的略微不同的SELECT语句。在这种情况下,我不认为视图有什么大的优势。

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


您可以考虑将查询放在函数中,并将其称为Primes以获取记录,或者使用与计数相对应的略微不同的SELECT语句。在这种情况下,我不认为视图有什么大的优势。

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


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

您没有提到您拥有的MSSQL版本或版本,但您可能正在查找“分区视图”甚至“分区表”(有关详细信息,请参阅联机丛书)。它们是否对您有任何好处取决于您拥有多少数据,而测试将是最好的发现方法


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

FYI,版本也相关:分区表仅在Enterprise edition(和Developer edition,这与不同的许可证相同)中可用。FYI,该版本也是相关的:分区表仅在Enterprise edition(和Developer edition)中可用,这两种版本具有不同的许可证。