SQL Server: 多个查询还是UNION

4
我有16个查询需要执行。所有这些查询都具有相同的格式:
SELECT string, number, number 

让我把这些数据分组起来,这样就可以创建一个包含所有结果的仪表板,这是有意义的。
我的问题是:你认为使用 UNION ALL 操作符会比一个一个地执行所有查询更快吗?

4
建议 - 如果您的数据库中有许多具有相同结构的表格,那么我认为您的数据库设计可以改进。另外,如果从不同/相同的表格查询类似的数据,则可以使用连接来提高性能。如果您提供表格结构、查询等信息,那么回答会更容易些。 - pavanred
或者你可以两者兼顾。将一些查询组合在一起,并并行运行这些组合的查询。我相信这是迄今为止最快的解决方案。 - Mika Karjunen
5个回答

6

UNION ALLUNION更快。

UNION的情况下,如果你有10列和100行,它会比较每个单元格(即10*100)以获取不同的值,而在UNION ALL中则不是这样。因此,获取不同的成本很高。


5

UNION ALL 肯定可以让你更快地获取数据。

但是,对于客户端的数据,您想怎么处理呢?如果您必须将其分成16个独立的数据集,则总体执行时间可能会增加。

无论您做什么,都只需要一次调用数据库,因此,如果您将其保留为16个单独的查询,则最好将它们全部调用在一个 存储过程(或子存储过程)中。


3

最好使用存储过程和一个临时表,将你的16个查询结果都插入到临时表中。然后从这个临时表返回结果。


2
这里使用临时表有什么好处?对我来说,这听起来像是一个潜在的I/O问题。 - Mika Karjunen

1
如果底层查询结果涉及对象的扫描操作,则对于 UNION,该操作只需要执行一次,但如果不是 UNION,则每个查询都需要执行一次 - 因此,是的,它可能会更快。
此外,使用单个查询将减少大量通信开销和交互。

1

将它们全部作为一个查询(联合在一起)执行将涉及1次往返到数据库,而不是16次往返 - 因为从您的.NET代码到SQL的每次往返都会产生开销,因此显然从这个角度来看,合理化到1次可能有益。

但是,根据确切的情况,还有其他方面需要考虑,例如:
- 如果您的查询都相当复杂,则可能变得更难维护(大量UNION复杂语句的大型查询)
- 如果单独需要每个查询(即您不总是想将它们作为一个结果集返回),则需要将每个查询分离成自己的存储过程(无法UNION存储过程)

那么如何将这些结果组合成一个调用将发生变化(例如,已经建议使用临时表方法)。但是总的来说,将往返到数据库服务器的次数最小化可以减少时间。要问自己的反面是:是否有其他领域可以进行调整,以在性能方面获得更大的回报?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接