create table records(
id varchar,
updated_at bigint
);
create index index1 on records (updated_at, id);
查詢。它迭代最近更新的記錄。獲取10條記錄,記得最後一條,然後取下10條記錄等等。
select * from objects
where updated_at > '1' or (updated_at = '1' and id > 'some-id')
order by updated_at, id
limit 10;
它採用了指數,但它並不明智地使用它,也適用於過濾和處理萬噸的記錄,請參閱下面的查詢說明Rows Removed by Filter: 31575
。
奇怪的是,如果您刪除or
並保留左側或右側狀態 - 對兩者都適用。但似乎如果不能找出如何正確應用索引,如果這兩個條件與or
同時使用。
Limit (cost=0.42..19.03 rows=20 width=1336) (actual time=542.475..542.501 rows=20 loops=1)
-> Index Scan using index1 on records (cost=0.42..426791.29 rows=458760 width=1336) (actual time=542.473..542.494 rows=20 loops=1)
Filter: ((updated_at > '1'::bigint) OR ((updated_at = '1'::bigint) AND ((id)::text > 'some-id'::text)))
Rows Removed by Filter: 31575
Planning time: 0.180 ms
Execution time: 542.532 ms
(6 rows)
Postgres的版本是9.6
'...其中的updated_at> '1' ...'你不應該引用整數常量。 – wildplasser
@wildplasser我試過沒有引號,同樣的事情。 –
'width = 1336'這是一個*非常寬的表, – wildplasser