shared hit
基本的に、値はコンピュータのメインメモリにすでにキャッシュされており、ハードディスクからこれを読み取る必要がなかったことを意味します。
メインメモリ(RAM)へのアクセスは非常に ハードディスクから値を読み取るよりも高速です。そのため、シェアヒット数が多いほどクエリが高速になります。
Postgresを起動した直後は、メインメモリ(RAM)で利用できるデータはなく、すべてをハードディスクから読み取る必要があります。
実行計画から次のステップを検討してください:
-> 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
「バッファ:共有読み取り=2818」の部分は、2818ブロック(各8k)をハードディスクから読み取る必要があることを意味します(48ミリ秒かかりました-SSDがあります)。これらの2818ブロックはキャッシュに保存されました( "共有バッファ ")次に必要になったときに、データベースが(遅い)ハードディスクからそれらを(再度)読み取る必要がないようにします。
そのステートメントを再実行すると、計画は次のように変更されます。
-> 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
つまり、前のステートメントがまだメインメモリ(=RAM)にあり、Postgresがハードディスクからそれらを読み取る必要がなかった2818ブロック。
「メモリ」とは、「外部ストレージ」とは対照的に、常にコンピュータに組み込まれ、CPUに直接アクセスできるメインメモリ(RAM)を指します。
Postgresが共有バッファを管理する方法についていくつかのプレゼンテーションがあります:
- http://de.slideshare.net/EnterpriseDB/insidepostgressharedmemory2015
- http://momjian.us/main/writings/pgsql/hw_performance/
- https://2ndquadrant.com/media/pdfs/talks/InsideBufferCache。 pdf (非常に 技術的)
- http://raghavt.blogspot.de/2012/ 04 / caching-in-postgresql.html