Postgresql 选择集合中两列之一的位置

杰杰

我的表:

  • R1(id serial, a int , b int) - 100k 记录
  • R2(id,serial,VAL unique) - 40k 记录

索引:r2(VAL),r1(a),r1(b)

我的目标:从 R1 获取所有记录,其中 a 或 b 等于 R2 中的 VAL

我想了两个选项:

select * from R1 where R1.a in (select VAL from R2) or R1.b in (select VAL from R2);

要么

select * from R1 where exists (select * from R2 where R1.a = R2.VAL or R1.b = R2.VAL);

在我的具体情况下:

  • 第一个查询在 R1 上使用 seq 扫描,在 r2 上使用哈希扫描。
  • 第二次扫描在 R1 上使用 seq 扫描,在 r2 上使用索引 R2(VAL) 进行位图扫描。

我想知道是否可以以更好的方式重写查询以获得性能。顺便说一句,我正在使用 pg 9.6

谢谢..

杰杰

在这种特定情况下,我在主要评论中建议的第一个查询似乎提供了最佳性能:

select * from R1 where R1.a in (select VAL from R2) or R1.b in (select VAL from R2);

如果有人想看看,@klin 准备了一个包含所有执行计划的 dbfiddle:https ://dbfiddle.uk/?rdbms=postgres_9.5&fiddle=5b50f605262e406c0bab13710ec121d5

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章