sql >> Databáze >  >> RDS >> PostgreSQL

Dotazy Postgres v produkci vedou k abnormálně vysokému I/O čtení z disku

Tento dotaz neprodukoval žádný diskový I/O – všechny bloky jsou čteny ze sdílených vyrovnávacích pamětí. Ale protože dotaz čte 73424 bloků (asi 574 MB), způsobí značné I/O zatížení, když tabulka není v mezipaměti.

Existují však dvě věci, které lze zlepšit.

  • Máte ztrátové blokové shody ve skenování haldy. To znamená, že work_mem není dostatečně velký, aby obsahoval bitmapu s bitem na řádek tabulky, a místo toho mapuje 26592 bitů blok tabulky. Všechny řádky musí být znovu zkontrolovány a 86733 řádků je vyřazeno, z nichž většina jsou falešně pozitivní ze ztrátových shod bloků.

    Pokud zvýšíte work_mem , bitmapa s bitem na řádek tabulky se vejde do paměti a toto číslo se zmenší, což sníží práci během skenování haldy.

  • 190108 řádků je vyřazeno, protože neodpovídají dodatečné podmínce filtru při skenování haldy bitmap. Zde se pravděpodobně tráví nejvíce času. Pokud tuto částku snížíte, vyhrajete.

    Ideální indexy pro tento dotaz by byly:

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

    Pokud transaction_type není příliš selektivní (tj. většina řádků má hodnotu Sale ), můžete tento sloupec vynechat.

UPRAVIT:

Zkouška vmstat a iostat ukazuje, že jak CPU, tak I/O subsystém trpí masivním přetížením:všechny prostředky CPU jsou vynaloženy na čekání na vstup/výstup a čas zkracování virtuálních počítačů. Potřebujete lepší I/O systém a hostitelský systém s více volnými prostředky CPU. Zvýšení RAM migjt zmírní I/O problém, ale pouze pro čtení disku.



  1. Prohlížení souborů PDF uložených v databázi MySQL pomocí chyby PHP

  2. Chyba syntaxe v testovacím kódu UPSERT

  3. node.js async/await pomocí s MySQL

  4. Potřebujete pomoc se spouštěčem a funkcí Postgres