Phân vùng trong postgresql hoạt động tốt cho các bản ghi lớn. Đầu tiên, hãy tạo bảng mẹ:
create table game_history_log (
gameid integer,
views integer,
plays integer,
likes integer,
log_date date
);
Bây giờ tạo các phân vùng. Trong trường hợp này, một cho mỗi tháng, 900 k hàng, sẽ là tốt:
create table game_history_log_201210 (
check (log_date between '2012-10-01' and '2012-10-31')
) inherits (game_history_log);
create table game_history_log_201211 (
check (log_date between '2012-11-01' and '2012-11-30')
) inherits (game_history_log);
Lưu ý các ràng buộc kiểm tra trong mỗi phân vùng. Nếu bạn cố gắng chèn vào phân vùng sai:
insert into game_history_log_201210 (
gameid, views, plays, likes, log_date
) values (1, 2, 3, 4, '2012-09-30');
ERROR: new row for relation "game_history_log_201210" violates check constraint "game_history_log_201210_log_date_check"
DETAIL: Failing row contains (1, 2, 3, 4, 2012-09-30).
Một trong những lợi thế của phân vùng là nó sẽ chỉ tìm kiếm trong phân vùng chính xác làm giảm đáng kể và nhất quán kích thước tìm kiếm bất kể dữ liệu đó có bao nhiêu năm. Đây là lời giải thích cho việc tìm kiếm một ngày nhất định:
explain
select *
from game_history_log
where log_date = date '2012-10-02';
QUERY PLAN
------------------------------------------------------------------------------------------------------
Result (cost=0.00..30.38 rows=9 width=20)
-> Append (cost=0.00..30.38 rows=9 width=20)
-> Seq Scan on game_history_log (cost=0.00..0.00 rows=1 width=20)
Filter: (log_date = '2012-10-02'::date)
-> Seq Scan on game_history_log_201210 game_history_log (cost=0.00..30.38 rows=8 width=20)
Filter: (log_date = '2012-10-02'::date)
Lưu ý rằng ngoài bảng cha, nó chỉ quét đúng phân vùng. Rõ ràng là bạn có thể có các chỉ mục trên các phân vùng để tránh bị quét tuần tự.