Разделянето в postgresql работи чудесно за големи регистрационни файлове. Първо създайте родителската таблица:
create table game_history_log (
gameid integer,
views integer,
plays integer,
likes integer,
log_date date
);
Сега създайте дяловете. В този случай един за всеки месец, 900 k реда, би било добре:
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);
Обърнете внимание на ограниченията за проверка във всеки дял. Ако се опитате да вмъкнете в грешен дял:
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).
Едно от предимствата на разделянето е, че то ще търси само в правилния дял, намалявайки драстично и последователно размера на търсене, независимо от това колко години има данни. Ето обяснението за търсене на определена дата:
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)
Забележете, че освен родителската таблица, тя сканира само правилния дял. Очевидно можете да имате индекси на дяловете, за да избегнете последователно сканиране.
Наследяване Разделяне на дялове