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

时间:2013-09-04 15:53:21

标签: sql complexity-theory

显然,在数学中,逻辑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(这是我个人和大学时使用的)。

1 个答案:

答案 0 :(得分:0)

我预计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出现了两次。它们是不同的Matts,但UNION将合并重复的Matts并仅报告一个(假设select firstname from table ...已完成)。

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