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

Les requêtes Postgres en production entraînent des E/S de lecture de disque anormalement élevées

Cette requête n'a produit aucune E/S de disque - tous les blocs sont lus à partir de tampons partagés. Mais puisque la requête lit 73 424 blocs (environ 574 Mo), elle produira une charge d'E/S importante lorsque la table n'est pas mise en cache.

Mais il y a deux choses qui peuvent être améliorées.

  • Vous avez des matchs de bloc avec perte dans l'analyse du tas. Cela signifie que work_mem n'est pas assez grand pour contenir un bitmap avec un bit par ligne de table, et 26592 bits mappent un bloc de table à la place. Toutes les lignes doivent être revérifiées et 86733 lignes sont supprimées, dont la plupart sont des faux positifs des correspondances de blocs avec perte.

    Si vous augmentez work_mem , un bitmap avec un bit par ligne de table tiendra en mémoire, et ce nombre diminuera, ce qui réduira le travail lors de l'analyse du tas.

  • 190108 lignes sont ignorées car elles ne correspondent pas à la condition de filtre supplémentaire dans l'analyse du tas bitmap. C'est probablement là que la plupart du temps est passé. Si vous pouvez réduire ce montant, vous gagnerez.

    Les index idéaux pour cette requête seraient :

    CREATE INDEX ON map_listing(transaction_type, la);
    CREATE INDEX ON map_listing(transaction_type, lo);
    

    Si transaction_type n'est pas très sélectif (c'est-à-dire que la plupart des lignes ont la valeur Sale ), vous pouvez omettre cette colonne.

MODIF :

Examen de vmstat et iostat montre que le processeur et le sous-système d'E/S souffrent d'une surcharge massive :toutes les ressources du processeur sont dépensées en attente d'E/S et en temps de vol de VM. Vous avez besoin d'un meilleur système d'E/S et d'un système hôte avec plus de ressources CPU libres. L'augmentation de la RAM peut atténuer le problème d'E/S, mais uniquement pour les lectures de disque.