【发布时间】:2015-05-19 21:11:24
【问题描述】:
请记住这两种查询:
--query1
Select someFields
From someTables
Where someWhereClues
Union all
Select someFields
FROM some Tables
Where someWhereClues
--query2
Select * FROM (
Select someFields
From someTables
Union all
Select someFields
FROM someTables
) DT
Where someMixedWhereClues
注意:
在两个查询中,最终结果字段相同
我认为是第一个。查询更快或性能更好!
但是经过一些研究后,我对此note感到困惑:
SQL Server(作为 RDBMS 的示例)首先读取整个数据,然后查找记录。 => 所以在这两个查询中,所有记录都会读取和查找。
请帮助我解决我的误解,以及 query1 和 query2 之间是否还有其他区别?
编辑:添加示例计划:
select t.Name, t.type from sys.tables t where t.type = 'U'
union all
select t.Name, t.type from sys.objects t where t.type = 'U'
select * from (
select t.Name, t.type from sys.tables t
union all
select t.Name, t.type from sys.objects t
) dt
where dt.type = 'U'
执行计划是:
两者相同且50%
【问题讨论】:
-
您可以通过对两个查询运行执行计划来检查发生了什么。
-
如果您检查给定数据的执行计划和服务器统计信息(时间/IO),那么您可以看到哪个更好。在我的脑海中,第一个看起来更好,但是 sql server 优化器可能足够聪明,可以使两者相等。因此 - 查看它运行的内容是分析的方式。
-
我也加了执行计划!!??
-
这基本上总是归结为一些基本建议:在 SQL 中,你应该告诉系统你想要什么,而不是如何去做和对于大多数情况,如果有多种方法可以编写逻辑上等效的同一查询,则优化器应该为任何查询生成相同的计划。因此,只需编写您认为读得最好的查询,并且仅在 测量的 性能不满足您的要求时才考虑更改查询。
-
您问题中的查询对似乎逻辑上相同。我不明白你关于“读写”的措辞。优化器试图做的一件事是尽可能地“推”谓词(条件)。如果它可以在扫描每个基本表时检查谓词(而不是需要检查涉及多个表的内容),那么它将在扫描表时执行这些检查(或在索引中查找)。
标签: sql-server performance union rdbms query-performance