shared hit
về cơ bản có nghĩa là giá trị đã được lưu trong bộ nhớ chính của máy tính và không cần thiết phải đọc giá trị này từ đĩa cứng.
Truy cập bộ nhớ chính (RAM) là nhiều nhanh hơn so với việc đọc các giá trị từ đĩa cứng. Và đó là lý do tại sao truy vấn càng nhanh thì càng có nhiều lượt truy cập chia sẻ.
Ngay sau khi khởi động Postgres, không có dữ liệu nào có sẵn trong bộ nhớ chính (RAM) và mọi thứ cần được đọc từ đĩa cứng.
Hãy xem xét bước này từ một kế hoạch thực hiện:
-> 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
Phần "Buffers:shared read =2818" có nghĩa là 2818 khối (mỗi 8k) phải được đọc từ đĩa cứng (và mất 48ms - tôi có ổ SSD). 2818 khối đó đã được lưu trữ trong bộ nhớ cache (" bộ đệm được chia sẻ ") để lần sau khi cần, cơ sở dữ liệu không cần đọc (lại) chúng từ đĩa cứng (chậm).
Khi tôi chạy lại câu lệnh đó, kế hoạch sẽ thay đổi thành:
-> 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
Có nghĩa là 2818 khối mà câu lệnh trước đó vẫn nằm trong bộ nhớ chính (=RAM) và Postgres không cần đọc chúng từ đĩa cứng.
"memory" luôn đề cập đến bộ nhớ chính (RAM) được tích hợp trong máy tính và có thể truy cập trực tiếp vào CPU - trái ngược với "bộ nhớ ngoài".
Có một số bản trình bày về cách Postgres quản lý bộ đệm được chia sẻ:
- http://de.slideshare.net/EnterpriseDB/insidepostgressharedmemory2015
- http://momjian.us/main/writings/pgsql/hw_performance/
- https://2ndquadrant.com/media/pdfs/talks/InsideBufferCache. pdf ( rất kỹ thuật)
- http://raghavt.blogspot.de/2012/ 04 / caching-in-postgresql.html