Prenons une table T en lecture seule, le modèle de requête de cette table est:

select some_columns
from T
where some_conditions
order by fixed_col1, fixed_col2

Existe-t-il un moyen de me permettre d'omettre la clause order by au moment de l'exécution, de pré-trier la table hors ligne et de stocker les lignes triées dans T, de sorte que lorsque je select sans order by, le les lignes sont déjà triées?

PS: le comportement doit être documenté quelque part, ou un bon sens pour la communauté PG.

1
Incömplete 27 oct. 2020 à 07:06

2 réponses

Meilleure réponse

Existe-t-il un moyen de me laisser omettre la clause order by lors de l'exécution?

Non, pas si vous voulez un ordre de tri garanti.

Le seul moyen d'obtenir un ordre de tri garanti dans une requête consiste à utiliser order by. il n'y a pas d'alternative. Les tables relationnelles représentent des ensembles non ordonnés, il n'y a donc pas de "lignes triées" dans une table.

Vous devrez utiliser order by pour obtenir un ordre de tri garanti.


le comportement doit être documenté quelque part, ou un bon sens pour la communauté PG.

Citation du manuel

Si le tri n'est pas choisi, les lignes seront renvoyées dans un ordre non spécifié. L'ordre réel dans ce cas dépendra des types de plans d'analyse et de jointure et de l'ordre sur le disque, mais il ne faut pas s'y fier . Un ordre de sortie particulier ne peut être garanti que si l'étape de tri est explicitement choisie.

(c'est moi qui souligne)

3
a_horse_with_no_name 27 oct. 2020 à 07:18

Vous pouvez utiliser une CLUSTER commande, ou vous pouvez créez simplement une nouvelle table par la commande CREATE TABLE xxx AS SELECT ... ORDER BY. Vous devriez quand même utiliser l'instruction ORDER BY car PostgreSQL a optimisé la lecture de tables plus volumineuses et essayez d'utiliser la lecture synchronisée pour plus de processus. Cette synchronisation peut faire ainsi la lecture de la table pour un processus commence dans 1/3 de la table - lecture jusqu'à la fin, retour au début et lecture en premier 1/3. Postgres n'assure donc pas non plus la lecture des données dans l'ordre physique.

2
Pavel Stehule 27 oct. 2020 à 05:20