sql >> Databasteknik >  >> RDS >> PostgreSQL

Delad träffcache i postgreSQL

shared hit betyder i huvudsak att värdet redan har cachats i datorns huvudminne och att det inte var nödvändigt att läsa detta från hårddisken.

Åtkomst till huvudminnet (RAM) är mycket snabbare än att läsa värden från hårddisken. Och det är därför frågan är snabbare ju fler andel träffar den har.

Direkt efter start av Postgres finns ingen av datan tillgänglig i huvudminnet (RAM) och allt behöver läsas från hårddisken.

Överväg detta steg från en genomförandeplan:

  ->  Seq Scan on products.product_price  (cost=0.00..3210.27 rows=392273 width=0) (actual time=0.053..103.958 rows=392273 loops=1)
        Output: product_id, valid_from, valid_to, price
        Buffers: shared read=2818
        I/O Timings: read=48.382

Delen "Buffertar:delad läsning=2818" betyder att 2818 block (varje 8k) måste läsas från hårddisken (och det tog 48ms - jag har en SSD). Dessa 2818 block lagrades i cachen (delade buffertar ") så att nästa gång de behövs behöver databasen inte läsa dem (igen) från den (långsamma) hårddisken.

När jag kör om det uttalandet ändras planen till:

  ->  Seq Scan on products.product_price  (cost=0.00..3210.27 rows=392273 width=0) (actual time=0.012..45.690 rows=392273 loops=1)
        Output: product_id, valid_from, valid_to, price
        Buffers: shared hit=2818

Vilket betyder att de där 2818 blocken som det tidigare uttalandet fortfarande fanns i huvudminnet (=RAM) och Postgres inte behövde läsa dem från hårddisken.

"minne" syftar alltid på huvudminnet (RAM) som är inbyggt i datorn och direkt tillgängligt för processorn - till skillnad från "extern lagring".

Det finns flera presentationer om hur Postgres hanterar de delade buffertarna:




  1. Hur STRING_ESCAPE()-funktionen fungerar i SQL Server (T-SQL)

  2. FEL:uppdatera eller ta bort på tabellanvändare bryter mot begränsningen för främmande nyckel fk_rails_03de2dc08c på tabellkommentarer

  3. Fel vid körning av migrering på Heroku, PostgreSQL med Rails 5

  4. Hur ansluter man mysql till Basex?