sql >> Base de Datos >  >> RDS >> PostgreSQL

Escaneo de índice para comparación de varias columnas:ordenación de columnas de índice no uniforme

PostgreSQL implementa tuplas muy a fondo (a diferencia de las implementaciones medias que se encuentran en Oracle, DB2, SQL Server, etc.). Puedes escribir tu condición usando "desigualdad de tuplas", como en:

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

Tenga en cuenta que dado que la segunda columna está en orden descendente, debe "invertir" su valor durante la comparación. Por eso se expresa como -b y también, -20 . Esto puede ser complicado para columnas no numéricas como fechas, varchars, LOB, etc.

Finalmente, el uso de un índice todavía es posible con -b valor de columna si crea un índice ad-hoc, como:

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

Sin embargo, nunca puede obligar a PostgreSQL a usar un índice. SQL es un lenguaje declarativo, no imperativo. Puedes atraer hacerlo manteniendo actualizadas las estadísticas de la tabla y también seleccionando un pequeño número de filas. Si su LIMIT es demasiado grande, es posible que PostgreSQL se incline a usar un escaneo de tabla completo en su lugar.