PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Scansione dell'indice per il confronto di più colonne - ordinamento delle colonne dell'indice non uniforme

PostgreSQL implementa le tuple in modo molto completo (a differenza delle mezze implementazioni trovate in Oracle, DB2, SQL Server, ecc.). Puoi scrivere la tua condizione usando "tuple inequality", come in:

select * 
from table1
where (a, -b, c) >= (10, -20, 30)
order by a, -b, c
limit 10

Si noti che poiché la seconda colonna è in ordine decrescente, è necessario "invertirne" il valore durante il confronto. Ecco perché è espresso come -b e anche -20 . Questo può essere complicato per colonne non numeriche come date, varchars, LOB, ecc.

Infine, l'uso di un indice è ancora possibile con il -b valore della colonna se crei un indice ad hoc, ad esempio:

create index ix1 on table1 (a, (-b), c);

Tuttavia, non puoi mai forzare PostgreSQL a utilizzare un indice. SQL è un linguaggio dichiarativo, non imperativo. Puoi attirare per farlo mantenendo aggiornate le statistiche della tabella e selezionando un numero ridotto di righe. Se il tuo LIMIT è troppo grande, PostgreSQL potrebbe essere propenso a utilizzare invece una scansione completa della tabella.