Schéma:Pourquoi PostgreSQL n'utilise pas l'index correctement?
create table records(
id varchar,
updated_at bigint
);
create index index1 on records (updated_at, id);
Recherche. Il itère sur les enregistrements récemment mis à jour. Récupère 10 enregistrements, se souvient du dernier, puis récupère les 10 suivants et ainsi de suite.
select * from objects
where updated_at > '1' or (updated_at = '1' and id > 'some-id')
order by updated_at, id
limit 10;
Il utilise l'index, mais cela ne l'utilise à bon escient et applique également le filtre et traite des tonnes de dossiers, voir Rows Removed by Filter: 31575
dans l'explication de la requête ci-dessous.
La chose étrange est que si vous supprimez or
et laissez l'une des conditions gauche ou à droite - il fonctionne bien pour les deux. Mais il semble que si vous ne pouvez pas comprendre comment appliquer correctement l'index si les deux conditions sont utilisées simultanément avec 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)
la version Postgres est 9.6
'... où updated_at> '1' ...' Vous ne devriez pas citation littéraux entiers. – wildplasser
@wildplasser Je l'ai essayé sans guillemets, même chose. –
'width = 1336' C'est une table * très * large, – wildplasser