در اوراکل 12cR2، می توان حین انجام عملیاتی چون alter table .. modify partition، move partition، split partition، بعضی از رکوردها را فیلتر کرد و یا به بیانی دقیق تر، کنار گذاشت. این کار با اضافه کردن عبارت INCLUDING ROWS WHERE در انتهای دستور alter table قابل انجام است.
برای مثال فرض کنید که اطلاعات حقوق و دستمزد افراد برای بازه زمانی شش ساله، در جدولی با نام saltbl قرار دارد و این جدول هنوز پارتیشن نشده است.
قصد داریم صرفا اطلاعات سالهای 2018 و 2019 این جدول را در دو پارتیشن مجزا قرار داده و اطلاعات سالهای قبل تر را از این جدول حذف کنیم. این کار قرار است به صورت انلاین و با کمک دستور alter table انجام شود.
با کمک ویژگی ای که در نسخه 12cR2 اضافه شد، این کار به سادگی قابل انجام خواهد بود. ادامه متن را بخوانید.
دستور زیر، فراوانی دیتای جدول saltbl را متناسب با هر سال نمایش می دهد.
SQL> select count(*),to_char(time_,’YYYY’) from saltbl group by to_char(time_,’YYYY’) order by 2;
COUNT(*) TO_CHAR(TIME_,’YYYY’)
———- ———————
100009 2014
100000 2015
100040 2016
100059 2017
100003 2018
100000 2019
10 rows selected
همانطور که بیان شد، قرار است ساختار این جدول را به فرمت پارتیشن تبدیل کرده و صرفا اطلاعات سالهای 2018 و 2019 را در این جدول حفظ و مابقی اطلاعات را از آن حذف کنیم:
ALTER TABLE saltbl MODIFY
PARTITION BY RANGE (time_) (
PARTITION p2018 VALUES LESS THAN (TO_date(‘1-1-2019’, ‘DD-MM-YYYY’)),
PARTITION p2019 VALUES LESS THAN (TO_date(‘1-1-2020’, ‘DD-MM-YYYY’))
) online
INCLUDING ROWS WHERE to_char(time_,’YYYY’) >= 2018;
همانطور که می بینید، این کار به صورت انلاین انجام شده است:
SQL> select count(*),to_char(time_,’YYYY’) from saltbl group by to_char(time_,’YYYY’) order by 2;
COUNT(*) TO_CHAR(TIME_,’YYYY’)
———- ———————
100003 2018
100000 2019
در ادامه قصد داریم بهمراه انجام عملیات move partition، رکوردهای 6 ماه اول پارتیشن p2018 را حذف کنیم:
SQL> select count(*),to_char(time_,’YYYY’) from saltbl group by to_char(time_,’YYYY’) order by 2;
COUNT(*) TO_CHAR(TIME_,’YYYY’)
———- ———————
100003 2018
100000 2019
SQL> ALTER TABLE saltbl MOVE PARTITION P2018 ONLINE INCLUDING ROWS WHERE to_char(time_,’YYYY/MM’) >=’2018/06′;
Table altered
SQL> select count(*),to_char(time_,’YYYY’) from saltbl group by to_char(time_,’YYYY’) order by 2;
COUNT(*) TO_CHAR(TIME_,’YYYY’)
———- ———————
40000 2018
100000 2019
نکته: کاربرد این قابلیت صرفا به مبحث پارتیشن بندی منحصر نمی شود و در زمانی که جدول پارتیشن هم نشده باشد هم می توان بعضی از عملیات نظیر alter table .. move online را با کمک این قابلت انجام داد. برای مثال، با اجرای دستور زیر، صرفا اطلاعات سال 2019 را در جدول ntbl حفظ کرده و بقیه اطلاعات را از این جدول حذف می کنیم:
SQL> alter table ntbl move online INCLUDING ROWS WHERE to_char(time_,’YYYY’) >= 2019;
Table altered
SQL> select count(*),to_char(time_,’YYYY’) from ntbl group by to_char(time_,’YYYY’) order by 2;
COUNT(*) TO_CHAR(TIME_,’YYYY’)
———- ———————
100000 2019
Comment (1)