هناك العديد من الطرق لتخزين المعلومات في قاعدة البيانات أوراكل وهي :
• Regular tables
• Partitioned tables
• Index-organized tables
• Clustered tables
سأتطرق في موضوعي هذا الى النوع الثاني وهي الجداول المقسمة أو المجزأة .
ميزاتها :
1- يمتلك هذا النوع من الجداول قسم أو عدة أقسام وتسمى (partition) وكل قسم يخزن أسطر التي تم تجزئتها بأحد أنواع التقسيم التالية :
range partitioning, hash partitioning, composite partitioning, or list partitioning.
2- كل قسم من الجدول المقسم عبارة عن segment وبالتالي بالأمكان ان يتواجد في tablespace مختلف في حال كانت قاعدة البيانات لديك تحتوي أكثر من tablespace .
3- تفيد هذه الجداول في حال كان لديك جداول كبيرة جدا وتمكن ان يستعلم عن البيانات أو تعالج بعد من العمليات بنفس الوقت (عدة مستخدمين يقومون بالاستعلام وتعديل البيانات في وقت واحد ) .
4- هناك العديد من الأوامر المتاحة لإدارة الأقسام في مثل هذه الجداول .
سأضرب مثال لاستخدام هذه الجداول : لنفرض مثلا أن لدى سوبر ماركت كبيرة قاعدة بيانات وهناك العديد من البيانات تدخل يوميا تصور حجم المعطيات المدخلة يوميا إذا فرضنا إنها تقدر بمئات الآلاف يوميا ولو قمت بعمل index على أعمدة معينة من هذا الجدول (العادي) تصور مدى حجم هذا الفهرس سيكون بالجيجا بايت وهذة مشكلة والشي الآخر تصور أن تقوم بعمل استعلام لاسترجاع بيانات يوم من شهر قد مضى كم من الوقت سيكلفك ؟
الحل هو أن تقوم بإنشاء partitioned table أن متأكد أن البعض سيقول وما الجديد سأقول لك ما الجديد ؟
هذا الجدول سأقوم بتجزئته إلى 12 قسم كل قسم يمثل شهر معين من السنة الحالية وبالتالي بيانات شهر فبراير ستكون في القسم الذي يمثل هذا الشهر وسوف تتوضح لك الفكرة عندما ترى الكود الذي ينشئ هذا الجدول أما الفائدة إذ أردت أن أستعلم عن بيانات عن يوم 5 من شهر يناير فأنني سوف أستخدم الاستعلام التالي :
Select * from super_market partition (p01)
Where day=’5-jan-09’;
وبهذا أكون قد استخدمت القسم الذي يمثل شهر يناير وهذا يجعل آداء الاستعلام سريع وكذلك سهولة إدارة الجدول وكذلك عملية backup و recovery ستعمل بآداء جيد .
لانشاء هذا الجدول :
هناك أربع طرق ذكرتها سابقا وسوف أستخدم هنا range partitioning كما سأستخدم العمود المسمى days لتحديد المجال لكل قسم
إليك الكود :
create table Super_Market
(ID Number primary key,
NAME VARCHAR2(20),
CategoryName VARCHAR2(20),
Rating VARCHAR2(2),
DAYS date)
partition by range (DAYS)
( PARTITION p01 VALUES LESS THAN (TO_DATE('01-FEB-2009','DD-MON-YYYY')),
PARTITION p02 VALUES LESS THAN (TO_DATE('01-MAR-2009','DD-MON-YYYY')),
PARTITION p03 VALUES LESS THAN (TO_DATE('01-APR-2009','DD-MON-YYYY')),
PARTITION p04 VALUES LESS THAN (TO_DATE('01-MAY-2009','DD-MON-YYYY')),
PARTITION p05 VALUES LESS THAN (TO_DATE('01-JUN-2009','DD-MON-YYYY')),
PARTITION p06 VALUES LESS THAN (TO_DATE('01-JUL-2009','DD-MON-YYYY')),
PARTITION p07 VALUES LESS THAN (TO_DATE('01-AUG-2009','DD-MON-YYYY')),
PARTITION p08 VALUES LESS THAN (TO_DATE('01-SEP-2009','DD-MON-YYYY')),
PARTITION p09 VALUES LESS THAN (TO_DATE('01-OCT-2009','DD-MON-YYYY')),
PARTITION p10 VALUES LESS THAN (TO_DATE('01-NOV-2009','DD-MON-YYYY')),
PARTITION p11 VALUES LESS THAN (TO_DATE('01-DEC-2009','DD-MON-YYYY')),
PARTITION p12 VALUES LESS THAN (TO_DATE('01-jan-2010','DD-MON-YYYY'))
);
-- sysdate= 21-feb-09
insert into super_market
values(2,'APP','FFG','sd',sysdate+90);
commit;
--not show the result because the sysdate is 21-02-2009
SELECT * FROM super_market partition (p01);
--this query will get the result
SELECT * FROM super_market partition (p02);
-- sysdate+90 = 22-may-09
insert into super_market
values(2,'APP','FFG','sd',sysdate+90);
commit;
SELECT * FROM super_market partition (p05);
--try this code get all data
SELECT * FROM super_market;
--to be sure from this table is patirtioned table use this query
--you will get 12 records ,each record represent a partition
SELECT * FROM dba_segments
where segment_name='SUPER_MARKET';
إدارة هذه الجداول :
تستطيع إستخدام alter table للقيام بأحد هذه الأوامر (add,drop,exchange,move,modify,rename,split,truncate) على ال partitions

ليست هناك تعليقات:
إرسال تعليق