Mempartisi di postgresql berfungsi dengan baik untuk log besar. Pertama buat tabel induknya:
create table game_history_log (
gameid integer,
views integer,
plays integer,
likes integer,
log_date date
);
Sekarang buat partisi. Dalam hal ini satu untuk setiap bulan, 900 k baris, akan bagus:
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);
Perhatikan batasan pemeriksaan di setiap partisi. Jika Anda mencoba memasukkan partisi yang salah:
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).
Salah satu keuntungan dari mempartisi adalah hanya akan mencari di partisi yang benar mengurangi ukuran pencarian secara drastis dan konsisten terlepas dari berapa tahun data yang ada. Berikut penjelasan untuk pencarian tanggal tertentu:
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)
Perhatikan bahwa selain dari tabel induk itu hanya memindai partisi yang benar. Jelas Anda dapat memiliki indeks pada partisi untuk menghindari pemindaian berurutan.