shared hit
zasadniczo oznacza to, że wartość została już zbuforowana w pamięci głównej komputera i nie było potrzeby jej odczytywania z dysku twardego.
Dostęp do pamięci głównej (RAM) to dużo szybciej niż odczytywanie wartości z dysku twardego. I dlatego zapytanie jest tym szybsze, im więcej ma trafień dotyczących udostępniania.
Zaraz po uruchomieniu Postgresa żadne dane nie są dostępne w pamięci głównej (RAM) i wszystko trzeba odczytać z dysku twardego.
Rozważ ten krok z planu wykonania:
-> 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
Część "Bufory:współdzielony odczyt=2818" oznacza, że 2818 bloków (każdy po 8k) musiało zostać odczytanych z dysku twardego (a to zajęło 48ms - mam dysk SSD). Te 2818 bloków było przechowywanych w pamięci podręcznej ("bufory wspólne "), aby następnym razem, gdy są potrzebne, baza danych nie musi ich (ponownie) odczytywać z (powolnego) dysku twardego.
Kiedy ponownie uruchomię to oświadczenie, plan zmieni się na:
-> 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
Co oznacza, że te 2818 bloków, które poprzednia instrukcja wciąż znajdowała się w pamięci głównej (=RAM), a Postgres nie musiał ich odczytywać z dysku twardego.
„pamięć” zawsze odnosi się do pamięci głównej (RAM) wbudowanej w komputer i bezpośrednio dostępnej dla procesora – w przeciwieństwie do „pamięci zewnętrznej”.
Istnieje kilka prezentacji na temat tego, jak Postgres zarządza współdzielonymi buforami:
- http://de.slideshare.net/EnterpriseDB/insidepostgressharedmemory2015
- http://momjian.us/main/writings/pgsql/hw_performance/
- https://2ndquadrant.com/media/pdfs/talks/InsideBufferCache. pdf (bardzo techniczne)
- http://raghavt.blogspot.de/2012/ 04/caching-in-postgresql.html