PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Analyse d'index pour comparaison multicolonne - ordre de colonne d'index non uniforme

PostgreSQL implémente les tuples de manière très approfondie (contrairement aux demi-implémentations trouvées dans Oracle, DB2, SQL Server, etc.). Vous pouvez écrire votre condition en utilisant "l'inégalité des tuples", comme dans :

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

Veuillez noter que puisque la deuxième colonne est en ordre décroissant, vous devez "inverser" sa valeur lors de la comparaison. C'est pourquoi il est exprimé sous la forme -b et aussi, -20 . Cela peut être délicat pour les colonnes non numériques telles que les dates, les varchars, les LOB, etc.

Enfin, l'utilisation d'un index est toujours possible avec le -b valeur de la colonne si vous créez un index ad hoc, tel que :

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

Cependant, vous ne pouvez jamais forcer PostgreSQL à utiliser un index. SQL est un langage déclaratif et non impératif. Vous pouvez attirer pour le faire en gardant les statistiques de la table à jour, et aussi en sélectionnant un petit nombre de lignes. Si votre LIMIT est trop grand, PostgreSQL peut être enclin à utiliser une analyse complète de la table à la place.