اعمال فیلترینگ در حین انجام عملیات بر روی جداول پارتیشن شده

خرید بک لینک

در اوراکل 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

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

سون لرن • آموزش...

ما را در سایت سون لرن • آموزش دنبال می‌کنید

برچسب: نویسنده: استخدام کار بازدید: 348 تاريخ: يکشنبه 8 دی 1398 ساعت: 12:18

صفحه بندی

خبرنامه