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

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

Comment (1)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.