PostgreSQL: Thời gian truy cập lần cuối vào bảng


10

Tôi phụ trách một cơ sở dữ liệu PostgreQuery lớn, với vài chục bảng. Tôi nghi ngờ rằng nhiều bảng trong số này không bao giờ được truy cập.

Cách tốt nhất để kiểm tra lần cuối cùng là một bảng nào đó được truy cập là khi nào? Tôi nghĩ đến việc bổ sung thêm một kích hoạt trên DELETE, INSERTUPDATE, nhưng tôi hy vọng có một cách hiệu quả hơn.



Cảm ơn, đã sửa. Ghi nhật ký có thể là giải pháp, nhưng DB được sử dụng rất nhiều và các bản ghi có thể sẽ chiếm nhiều dung lượng đĩa.
Adam Matan

Câu trả lời:


9

pg_catalog.pg_statio_all_tables là bạn của bạn. Tất cả những gì bạn cần làm là thăm dò định kỳ pg_statio_all_tables cho các bảng trong câu hỏi. Thay đổi số liệu thống kê ~ bảng hoạt động, số liệu thống kê không thay đổi ~ bảng có khả năng không được sử dụng. Chỉ cần cẩn thận rằng không ai làm một select pg_stat_reset () ;trong giữa giám sát của bạn.

Ví dụ:

test_1=# create table test_stats (col1 integer);
CREATE TABLE

test_1=# select * from pg_catalog.pg_statio_all_tables 
         where schemaname not in ('pg_catalog', 'information_schema') 
         and relname = 'test_stats';
 relid | schemaname |  relname   | heap_blks_read | heap_blks_hit | idx_blks_read | idx_blks_hit | toast_blks_read | toast_blks_hit | tidx_blks_read | tidx_blks_hit 
-------+------------+------------+----------------+---------------+---------------+--------------+-----------------+----------------+----------------+---------------
 22957 | public     | test_stats |              0 |             0 |        [null] |       [null] |          [null] |         [null] |         [null] |        [null]
(1 row)

Chèn:

test_1=# insert into test_stats (col1) select generate_series( 1, 10000000);
INSERT 0 10000000

test_1=# select * from pg_catalog.pg_statio_all_tables
         where schemaname not in ('pg_catalog', 'information_schema') 
         and relname = 'test_stats';
 relid | schemaname |  relname   | heap_blks_read | heap_blks_hit | idx_blks_read | idx_blks_hit | toast_blks_read | toast_blks_hit | tidx_blks_read | tidx_blks_hit 
-------+------------+------------+----------------+---------------+---------------+--------------+-----------------+----------------+----------------+---------------
 22957 | public     | test_stats |          44260 |      10088481 |        [null] |       [null] |          [null] |         [null] |         [null] |        [null]
(1 row)

Chọn:

test_1=# select count (*) from test_stats where col1 between 10000 and 50000;
 count 
-------
 40001
(1 row)

test_1=# select * from pg_catalog.pg_statio_all_tables
         where schemaname not in ('pg_catalog', 'information_schema') 
         and relname = 'test_stats';
 relid | schemaname |  relname   | heap_blks_read | heap_blks_hit | idx_blks_read | idx_blks_hit | toast_blks_read | toast_blks_hit | tidx_blks_read | tidx_blks_hit 
-------+------------+------------+----------------+---------------+---------------+--------------+-----------------+----------------+----------------+---------------
 22957 | public     | test_stats |          85560 |      10091429 |        [null] |       [null] |          [null] |         [null] |         [null] |        [null]
(1 row)

Xóa:

test_1=# delete from test_stats where col1 between 10000 and 50000;
DELETE 40001

test_1=# select * from pg_catalog.pg_statio_all_tables
         where schemaname not in ('pg_catalog', 'information_schema') 
         and relname = 'test_stats';
 relid | schemaname |  relname   | heap_blks_read | heap_blks_hit | idx_blks_read | idx_blks_hit | toast_blks_read | toast_blks_hit | tidx_blks_read | tidx_blks_hit 
-------+------------+------------+----------------+---------------+---------------+--------------+-----------------+----------------+----------------+---------------
 22957 | public     | test_stats |         155075 |      10136163 |        [null] |       [null] |          [null] |         [null] |         [null] |        [null]
(1 row)

cập nhật-- 2011-09-01

Thử nghiệm thêm cho thấy rằng vacuumdường như tăng các giá trị trong pg_statio_all_tables, điều này không may cho việc sử dụng mong muốn của bạn. Mặc dù vacuumkhông sử dụng pg_statio_all_tables vô dụng, nhưng nó làm cho việc diễn giải kết quả trở nên khó hiểu hơn một chút.

Có lẽ một nơi tốt hơn để theo dõi là pg_catalog.pg_stat_all_tables (ít nhất là với các phiên bản mới hơn của PG). Tôi đang xem phiên bản 8.4 và có các bộ dữ liệu được chèn, đọc, cập nhật và xóa-- ISTR 8.2 không có tất cả những điều đó và tôi không biết về 8.3 vì vậy YMMV tùy thuộc vào phiên bản của PG mà bạn đang sử dụng.

Tùy chọn thứ ba (để chèn, cập nhật và xóa hoạt động) là xem dấu thời gian của tệp trong thư mục $ PGDATA / base / $ datid. Tên tệp phải ánh xạ tới oid của bảng, vì vậy bạn có thể sử dụng tên này để xác định các bảng không nhận được chèn, cập nhật hoặc xóa. Thật không may, đây không phải là các bảng địa chỉ vẫn được chọn từ và sử dụng không gian bảng sẽ gây ra các biến chứng bổ sung (vì các tệp đó sẽ không nằm dưới $ PGDATA / base / $ datid). Dấu thời gian sẽ không cập nhật cho đến khi bất kỳ thay đổi đang chờ xử lý nào bị xóa, nhưng nếu tệp không thay đổi trong nhiều tháng thì tỷ lệ thay đổi hiện đang chờ xử lý có thể là nhỏ.


3

Bạn có thể nhận được một số thông tin về thay đổi cuối cùng với bảng xmin, ví dụ:

select max(xmin::text::bigint) from t;

Nhưng, bạn cần phải biết về modulo và xidsđóng băng . Không có cách nào chuyển đổi điều này thành "thời gian", nhưng nếu bạn nắm bắt được giá trị cho các bảng của mình ngay bây giờ, thì hãy so sánh vào một ngày sau đó, bạn có thể nhận được một danh sách các bảng đã thay đổi

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.