小编Moh*_*ein的帖子

为什么 OR 语句比 UNION 语句慢?

数据库版本:PostgreSQL 12.6

我有一张有 600,000 条记录的表。

该表具有以下列:

  • 名称 (varchar)
  • location_type (int) 枚举值:(1,2,3)
  • 血统(varchar)

索引:

  • 血统(btree)

祖先列是一种构建树的方法,其中每一行都有一个祖先,其中包含所有以“/”分隔的父 ID。

考虑以下示例:

ID 姓名 祖先
1 空值
5 节点 '1'
12 节点 '1/5'
22 叶子 '1/5/12'

以下查询需要 686 毫秒来执行:

SELECT * FROM geolocations
WHERE EXISTS (
   SELECT 1 FROM geolocations g2
   WHERE g2.ancestry =
      CONCAT(geolocations.ancestry, '/', geolocations.id)
)
Run Code Online (Sandbox Code Playgroud)

此查询在 808 毫秒内运行:

SELECT * FROM geolocations
WHERE location_type = 2
Run Code Online (Sandbox Code Playgroud)

将两个查询与 OR 结合使用时,如果它完成,则需要大约 4475 毫秒才能完成。

SELECT * FROM geolocations
WHERE EXISTS (
   SELECT 1 FROM …
Run Code Online (Sandbox Code Playgroud)

postgresql performance postgresql-12

11
推荐指数
3
解决办法
3097
查看次数

标签 统计

performance ×1

postgresql ×1

postgresql-12 ×1