具有OFFSET的PostgreSQL LIMIT不能超过100000

问题描述

我正在为我的项目使用postgres(9.6)泊坞窗。加载大量数据(例如234453)后,我需要使用限制和偏移量将数据切成块。但是我观察到我的查询已超出100000的限制。 就像我给100000限制时可以削减。但是当我使用120000时,它就挂了。

已加载数据:234453行 查询: 这正在工作: docker exec -it pg_1 psql -P pager postgres postgres -t -c“从schema1.table1删除,其中col_id不在(从schema1.table1选择col_id限制100000偏移量1)”

这被绞死了: docker exec -it pg_1 psql -P pager postgres postgres -t -c“从schema1.table1中删除,其中col_id不在(从schema1.table1中选择col_id,限制为120000偏移量1)”

一个削减应该是从100001到230000,类似这样。

您能告诉我,我该怎么做?还是我做错了什么?

谢谢, Suvendu

解决方法

正如我在this article中所述,“偏移分页”仅在“偏移”值相对较小时才有效。

否则,即使您为排序和过滤条件建立索引,数据库也将必须扫描索引并对条目进行计数,直到达到正确的OFFSET值为止。对于非常大的值,这意味着将几乎完全扫描索引。

因此,最好使用Keyset Pagination。请查阅Markus Winand撰写的this article,以详细说明如何在PostgreSQL中实现键集分页。

,

我已经尝试过 row_number() 并且它也适用于大量数据。 以下是我的查询:

docker exec -it pg_1 psql -P pager postgres postgres -t -c "delete from schema1.table1 WHERE col_id NOT IN (SELECT x.col_id FROM (select col_id,ROW_NUMBER () OVER (ORDER BY col_id) from schema1. table1) x WHERE ROW_NUMBER BETWEEN 100001 AND 230000)"