当 UNION 不再优于 SQL 查询中的 OR 条件时?
When UNION stops being superior than OR conditions in SQL queries?
在大多数情况下,当我尝试删除 OR 条件并将它们替换为 UNION(单独保存每个条件)时,它的性能明显更好,因为查询的那些部分再次可索引。
是否有关于此 'trick' 何时不再有用的经验法则(也许还有一些支持它的文档)?它对 2 OR 条件有用吗?对于 10 个 OR 条件?随着 UNION 数量的增加,UNION 不同的部分可能会有自己的开销。
您对此的经验法则是什么?
改造小例子:
SELECT
a, b
FROM
tbl
WHERE
a = 1 OR b = 2
转换为:
(SELECT
tbl.a, tbl.b
FROM
tbl
WHERE
tbl.b = 2)
UNION DISTINCT
(SELECT
tbl.a, tbl.b
FROM
tbl
WHERE
tbl.a = 1)
我建议没有有用的经验法则 (RoT)。这就是为什么...
正如您所暗示的,更多 UNIONs
意味着工作更慢,而更多 ORs
则不会(至少不会很多)。联合的 SELECTs
是昂贵的,因为它们是分开的。我估计 N SELECTs
的 UNION
需要大约 N+1 或 N+2 个时间单位,其中索引 SELECT
需要 1 个时间单位。相比之下,多个 ORs
几乎不会减慢查询速度,因为获取 table 的所有行是代价高昂的部分。
UNION
中每个 SELECT
的运行速度取决于索引的质量和获取的行数。这可能会有很大差异。 (因此,很难设计 RoT。)
A UNION
首先生成一个临时文件 table,每个 SELECT
将其找到的行添加到其中。这是一些开销。在较新的版本(5.7.3 / MariaDB 10.1)中,在有限的情况下可以避免 temp table 。 (这消除了假设的 +1 或 +2,从而增加了设计 RoT 的复杂性。)
如果它是 UNION DISTINCT
(默认值)而不是 UNION ALL
,则需要进行重复数据删除处理,可能涉及对温度进行排序 table.注意:这意味着即使是新版本也无法避免 temp table。 UNION DISTINCT
精确模仿 OR
,但 你 可能知道 ALL
会给出相同的答案。
在大多数情况下,当我尝试删除 OR 条件并将它们替换为 UNION(单独保存每个条件)时,它的性能明显更好,因为查询的那些部分再次可索引。
是否有关于此 'trick' 何时不再有用的经验法则(也许还有一些支持它的文档)?它对 2 OR 条件有用吗?对于 10 个 OR 条件?随着 UNION 数量的增加,UNION 不同的部分可能会有自己的开销。
您对此的经验法则是什么?
改造小例子:
SELECT
a, b
FROM
tbl
WHERE
a = 1 OR b = 2
转换为:
(SELECT
tbl.a, tbl.b
FROM
tbl
WHERE
tbl.b = 2)
UNION DISTINCT
(SELECT
tbl.a, tbl.b
FROM
tbl
WHERE
tbl.a = 1)
我建议没有有用的经验法则 (RoT)。这就是为什么...
正如您所暗示的,更多
UNIONs
意味着工作更慢,而更多ORs
则不会(至少不会很多)。联合的SELECTs
是昂贵的,因为它们是分开的。我估计 NSELECTs
的UNION
需要大约 N+1 或 N+2 个时间单位,其中索引SELECT
需要 1 个时间单位。相比之下,多个ORs
几乎不会减慢查询速度,因为获取 table 的所有行是代价高昂的部分。UNION
中每个SELECT
的运行速度取决于索引的质量和获取的行数。这可能会有很大差异。 (因此,很难设计 RoT。)A
UNION
首先生成一个临时文件 table,每个SELECT
将其找到的行添加到其中。这是一些开销。在较新的版本(5.7.3 / MariaDB 10.1)中,在有限的情况下可以避免 temp table 。 (这消除了假设的 +1 或 +2,从而增加了设计 RoT 的复杂性。)如果它是
UNION DISTINCT
(默认值)而不是UNION ALL
,则需要进行重复数据删除处理,可能涉及对温度进行排序 table.注意:这意味着即使是新版本也无法避免 temp table。UNION DISTINCT
精确模仿OR
,但 你 可能知道ALL
会给出相同的答案。