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)
ध्यान दें कि मूल तालिका के अलावा यह केवल सही विभाजन को स्कैन करता है। स्पष्ट रूप से अनुक्रमिक स्कैन से बचने के लिए आप विभाजन पर अनुक्रमणिका रख सकते हैं।