是一个使用OR的SQL查询,在运行时等效于使用UNION的多个SQL查询



显然,在数学中,逻辑AND和OR类似于集合论INTERSECT和UNION。也就是说,如果A和B是集合,那么{x:x IN A OR x IN B}=A UNION B(类似于and和INTERSECT)。

我的问题如下:这个数学等式是否对应于SQL中的运行时间等价性?具有一组OR表达式的单个SQL查询所花费的时间是否与一组彼此统一的SQL查询所花的时间相等?更准确地说,这是吗

SELECT * FROM A
WHERE A.x = a OR A.x = b OR ... OR A.x = z

运行时间与此相当?

SELECT * FROM A
WHERE A.x = a
UNION
...
UNION
SELECT * FROM A
WHERE A.x = z

如果实现很重要,我关心MySQL(这是我在工作中使用的)和PostgreSQL(我个人和大学都使用的)。

我预计UNION在理论上会更慢。考虑这样的数据集:

Firstname  Age
---------  ----
John       20
Matt       30
Jess       30
Nate       20 
Tor        10
Matt       20  // different Matt

查询select Firstname from table where age in (10,20,30)可以逐行进行并提取与搜索条件匹配的数据。

查询select Firstname .. UNION .. select Firstname .. UNION ..必须从上到下进行3次(假设正在进行表扫描)——一次用于10、20和30。获取数据后,UNION将删除重复信息。在上面的测试用例中,Matt出现了两次。它们是不同的Matt,但UNION将合并重复的Matt并只报告一个(假设select firstname from table ...完成)。

正如评论员所提到的,为了获得最佳性能,数据库可能会以不同的方式实现或尝试重写查询。

最新更新