我有一个主键为两个数字列的表。在事务中,我选择第一个(按主键列排序)n行(对于n=500左右)进行更新,处理它们,然后更新它们。
SELECT ...
ORDER BY pk1, pk2
LIMIT 500
FOR UPDATE
现在,我不确定在更新的行中选择这些行的最佳方法是什么 WHERE
条款。我试过这个:
array[pk1, pk2] >= array[$first_pk1_value, $first_pk2_value]
AND array[pk1, pk2] <= array[$last_pk1_value, $last_pk2_value]
(其中 pk1
以及 pk2
是主键列和 ${first,last}_pk{1,2}_value
是在“选择”窗口中扫描的第一行和最后一行的相应列的扫描值
假设数组是按字典顺序排列的,就像 ORDER BY pk1, pk2
是的,这会找到正确的行。
我也试过类似的方法:
(pk1 = $first_pk1_value AND pk2 >= $first_pk2_value)
OR (pk1 > $first_pk1_value AND pk1 < $last_pk1_value)
OR (pk1 = $last_pk1_value AND pk2 <= $last_pk2_value)
两种方法都有效,但都是顺序扫描。因为where子句只是表示主键上的一个范围,所以我希望postgres进行索引扫描。
是postgres不支持在多列索引上选择一个范围,还是我做错了什么?
1条答案
按热度按时间lyfkaqu11#
更新
作为对toni评论的回应,我试着像在python中一样使用tuple,它比我最初的建议效果要好得多。基于
analyze
输出,隐式row(id1, id2)
与支持pk的索引兼容。下面的旧答案已被取代
您应该能够通过指定索引的范围来强制使用索引
pk1
然后包括一个and
对于array[pk1, pk2]
条件。这对我来说在一个测试表中起了作用: