Maison >base de données >tutoriel mysql >Pourquoi mon ordre de requête de sélection PostgreSQL change-t-il après la mise à jour des données ?

Pourquoi mon ordre de requête de sélection PostgreSQL change-t-il après la mise à jour des données ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-02 09:41:30907parcourir

Why Does My PostgreSQL Select Query Order Change After Updating Data?

Ordre des lignes imprévisible dans les requêtes de sélection PostgreSQL après modification des données

Lors de l'exécution d'une requête SELECT sans spécifier de clause ORDER BY dans PostgreSQL, le résultat les lignes sont généralement récupérées dans l'ordre dans lequel elles sont stockées physiquement sur le disque. Cependant, cet ordre par défaut peut changer de manière inattendue après avoir effectué des modifications de données telles que des mises à jour ou des insertions.

Considérons l'exemple suivant :

postgres=# select * from check_user;
 id | name
----+------
  1 | x
  2 | y
  3 | z
  4 | a
  5 | c1
  6 | c2
  7 | c3
(7 rows)

postgres=# update check_user set name = 'c1' where name = 'c1\';
UPDATE 1

postgres=# select * from check_user;
 id | name
----+------
  1 | x
  2 | y
  3 | z
  4 | a
  6 | c2
  7 | c3
  5 | c1
(7 rows)

Avant de mettre à jour la ligne 5, les lignes étaient renvoyées par ordre croissant. par identifiant. Cependant, après l'opération de mise à jour, la position de la ligne 5 a changé, entraînant un ordre différent.

Explication :

Ce comportement est dû aux mécanismes internes de gestion de PostgreSQL stockage et récupération des données.

  • Stockage physique des lignes : Les lignes sont physiquement stockées sur des pages de disque. Lorsqu'une ligne est mise à jour, une nouvelle version de la ligne est écrite sur une nouvelle page.
  • Accès à la page : Lorsque PostgreSQL lit les lignes d'une table, il récupère généralement les pages du disque dans un commande spécifique. Cet ordre peut varier en fonction de facteurs tels que l'utilisation de l'index et l'utilisation du cache de pages.
  • Ordre par défaut : Sans clause ORDER BY, PostgreSQL récupère les lignes des pages dans l'ordre dans lequel elles sont stockées sur celles-ci. pages. Étant donné que les lignes sont physiquement stockées dans l'ordre des mises à jour, l'ordre par défaut peut changer après des modifications de données.

Conclusion :

Il est important de noter que s'appuyer sur le comportement de classement par défaut dans PostgreSQL peut conduire à des résultats inattendus. Pour garantir un ordre cohérent des lignes, spécifiez toujours une clause ORDER BY explicite dans vos requêtes SELECT. Alternativement, si vous avez besoin que l'ordre des lignes soit cohérent après les modifications des données, vous pouvez créer un index sur la colonne de tri souhaitée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn