Tại sao một câu lệnh CHỌN bộ đệm bộ đệm bẩn trong Postgres?


8

Tôi đang chạy EXPLAIN (ANALYZE, BUFFERS) SELECT ...trong máy chủ Postgres 9.3 của mình. Tôi cuối cùng thấy một cái gì đó như Buffers: shared hit=166416 dirtied=2trong đầu ra.
Từ tài liệu , "bẩn" chỉ ra:

Số lượng khối bị bẩn cho biết số khối chưa được sửa đổi trước đó đã bị thay đổi bởi truy vấn này; trong khi số khối được viết chỉ ra số khối bị bẩn trước đó bị đuổi khỏi bộ đệm bởi phụ trợ này trong quá trình xử lý truy vấn.

Điều này đối với tôi như quá trình đánh dấu một khối bẩn chỉ nên xảy ra khi cập nhật dữ liệu. Truy vấn của tôi là SELECT, tuy nhiên, và chỉ đọc dữ liệu. Tôi sẽ tưởng tượng nó sẽ chỉ báo cáo lượt truy cập hoặc đọc. Tôi rõ ràng là nhầm lẫn. Chính xác thì chuyện gì đang xảy ra trong tình huống này?

Câu trả lời:


10

Điều này có một lý do đơn giản.

Trong PostgreSQL, một hàng phải trải qua kiểm tra mức độ hiển thị. Trong lần đọc đầu tiên, hệ thống sẽ kiểm tra xem mọi người có thể nhìn thấy một hàng không. Nếu có, nó sẽ bị "đóng băng". Đây là nơi viết đến từ. Tương tự, VACUUMcũng đặt bit.

Có một lời giải thích chi tiết: http://www.cybertec.at/speeding-up-things-with-hint-bits/ .


1
Blog của bạn là một nguồn thông tin thực sự có giá trị. Đồng thời, vui lòng thêm các điểm chính của bài đăng của bạn vào câu trả lời này để nó tuân thủ các quy tắc ở đây.
dezso

điều này là: trong postgresql, một hàng phải trải qua kiểm tra mức độ hiển thị. Đầu tiên hãy đọc hệ thống kiểm tra xem mọi người có thể nhìn thấy một hàng không. nếu có, nó sẽ bị "đóng băng". đây là nơi viết đến từ btw, chân không cũng đặt bit. nó là một vấn đề tương tự
Hans-Jürgen Schönig

Tôi có một khiếu nại. Bạn chắc chắn có nghĩa là "bit gợi ý" ở đây. "Frozen" là một cái gì đó khá khác biệt trong PostgreSQL và các bộ dữ liệu không bao giờ bị đóng băng trong thời gian a SELECT.
Laurenz Albe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.