در دیتابیس های اوراکل نگارش 9i و بالاتر می توان جدول ها یا پارتیشن ها را فشرده نمود. فشرده بودن یا نبودن جدول ها به طور کامل از دید برنامه نویسان دیتابیس و APPLICATION مخفی است. در ادامه انواع روش های فشرده سازی جدول و ویژگی های آنها را معرفی می کنیم.
در نگارش 9 و 10 اوراکل، فشرده سازی به روش BASIC انجام می گیرد. روش BASIC برای جدول هایی که داده های آنها STATIC هستند مناسب است و در صورت انجام سایر عملیات DML داده های جدول از حالت فشرده خارج خواهد شد.
در نگارش 11 و بالاتر ، روش های دیگر فشرده سازی جدول ارائه شده است که با بکارگیری الگوریتم های خاص امکان استفاده از فشرده سازی برای جدول هایی که عملیات DML روی آنها انجام می شود را فراهم می کند. بنابراین این روش های فشرده سازی مناسب سیستم های OLTP هستند.
مزایای فشرده سازی
– سبب صرفه جویی در مصرف فضای دیسک می شود(جدول های فشرده معمولا 2 تا 3 برابر فضای دیسک کمتر نیاز خواهند داشت).
– عملیات I/O کاهش می یابد.
– فضای مورد نیاز BUFFER CACHE کاهش می یابد.
حالت های مختلف فشرده سازی
1.NOCOMPRESS: برای جدول و یا پارتیشن هیچ گونه فشرده سازی استفاده نشده است.
2.COMPRESS: فشرده سازی به روش BASIC انجام می شود بنابراین این روش مناسب جدول ها یا پارتیشن های بدون update و delete و سیستم های DATA WAREHOUSE است.
3.COMPRESS FOR DIRECT_LOAD OPERATIONS: همان روش COMPRESS است.
4.COMPRESS FOR OLTP یا COMPRESS FOR ALL OPERATIONS : این روش مناسب جدول هایی است که عملیات DML روی آنها انجام می شود. برای استفاده از این روش می بایست پارامتر COMPATIBLE برابر با 11.1.0 یا بالاتر تنظیم شود.
معایب فشرده سازی
– LOAD کردن داده ها و انجام عملیات DML در جدول های فشرده سبب افزایش کارکرد CPU می شود.
– برای جدول های با DML بالا مناسب نیست.
محدودیت های فشرده سازی
-زمانی که از حالت COMPRESS FOR ALL OPERATION استفاده می شود می توان ستون اضافه یا کم کرد ولی در حالت BASIC فقط می توان یک ستون را UNUSED کرد یا ستون های بدون مقدار DEFAULT اضافه کرد.
-برای جدول هایی که بیش از 255 ستون دارند نمی توان از فشرده سازی استفاده کرد.
– برای جدول های EXTERNAL یا جدول هایی که عضو یک CLUSTER هستند نمی توان از فشرده سازی استفاده نمود.
دستورات فشرده کردن جدول ها
می توان در زمان ساخت جدول نوع فشرده سازی را مشخص کرد:
SQL> create table milad.testtbl1
( numb int ,nam varchar2(10) ,hire_date date)
NOCOMPRESS;
Table created
SQL> create table milad.testtbl2
( numb int ,nam varchar2(10) ,hire_date date)
COMPRESS;
Table created
SQL> create table milad.testtbl3
(numb int ,nam varchar2(10) ,hire_date date)
COMPRESS FOR ALL OPERATIONS;
Table created
SQL> select s.table_name ,s.compression , s.compress_for from dba_tables s where s.table_name =’TESTTBL3′;
TABLE_NAME COMPRESSION COMPRESS_FOR
—————————— ———– ————
TESTTBL3 ENABLED OLTP
SQL>
می توان وضعیت فشرده بودن جدول را ALTER کرد:
SQL> alter table milad.testtbl3 NOCOMPRESS;
Table altered
SQL> alter table milad.testtbl3 COMPRESS;
Table altered
SQL> select s.table_name ,s.compression , s.compress_for from dba_tables s where s.table_name =’TESTTBL3′;
TABLE_NAME COMPRESSION COMPRESS_FOR
—————————– – ———– ————
TESTTBL3 ENABLED BASIC
SQL>
نکته: زمانی که یک جدول را با استفاده از دستور alter به حالت فشرده می بریم فقط داده های جدید که به جدول اضافه می شوند به صورت فشرده ذخیره می شوند. همچنین اگر با دستور alter جدول را به حالت غیر فشرده ببریم داده های فشرده قبلی به صورت فشرده باقی می مانند. اما اگر در هرکدام از این حالت ها از کلمه کلیدی move استفاده شود داده های قبلی جدول نیز فشرده یا غیر فشرده می شوند:
SQL> alter table milad.testtbl3 MOVE COMPRESS;
Table altered
SQL> alter table milad.testtbl3 MOVE NOCOMPRESS;
Table altered
نکته: برای اجرا شدن دستور move در ابتدا به فضای compress + nocompress برای داده ها نیاز داریم تا عمل تبدیل داده های قبلی انجام شود.
نکته: می توان تمام پارتیشن ها را فشرده کرد:
CREATE TABLE test_tab (
id NUMBER(10) NOT NULL,
description VARCHAR2(100) NOT NULL,
created_date DATE NOT NULL,
created_by VARCHAR2(50) NOT NULL,
updated_date DATE,
updated_by VARCHAR2(50)
)
COMPRESS
PARTITION BY RANGE (created_date) (
PARTITION test_tab_q1 VALUES LESS THAN (TO_DATE(’01/04/2003′, ‘DD/MM/YYYY’)),
PARTITION test_tab_q2 VALUES LESS THAN (MAXVALUE)
);
SELECT partition_name, compression, compress_for FROM user_tab_partitions
WHERE table_name = ‘TEST_TAB’ ORDER BY 1;
PARTITION_NAME COMPRESS COMPRESS_FOR
—————————— ——– ————-
TEST_TAB_Q1 ENABLED BASIC
TEST_TAB_Q2 ENABLED BASIC
نکته: می توان فقط یک پارتیشن خاص را فشرده کرد:
CREATE TABLE test_tab (
id NUMBER(10) NOT NULL,
description VARCHAR2(100) NOT NULL,
created_date DATE NOT NULL,
created_by VARCHAR2(50) NOT NULL,
updated_date DATE,
updated_by VARCHAR2(50)
)
NOCOMPRESS
PARTITION BY RANGE (created_date) (
PARTITION test_tab_q1 VALUES LESS THAN (TO_DATE(’01/04/2003′, ‘DD/MM/YYYY’)) COMPRESS,
PARTITION test_tab_q2 VALUES LESS THAN (MAXVALUE)
);
SELECT partition_name, compression, compress_for FROM user_tab_partitions WHERE table_name = ‘TEST_TAB’ORDER BY 1;
PARTITION_NAME COMPRESS COMPRESS_FOR
—————————— ——– —————–
TEST_TAB_Q1 ENABLED BASICTEST_TAB_Q2
نکته: اولویت با کلمه compress یا nocompress در عبارت تعریف پارتیشن است.
مثال: فشرده سازی یکی از پارتیشن ها به منظورکاهش سایز آن
SQL> select f.partition_name, f.segment_type,f.segment_name, bytes/1024/1024 ” size in MB ” from dba_segments f where f.segment_name=’SAVABEGH’ ;
PARTITION_NAME SEGMENT_TYPE SEGMENT_NAME size in MB
———————– ————— ————— ————
SAVABEGH_Q1 TABLE PARTITION SAVABEGH 31
SAVABEGH_Q2 TABLE PARTITION SAVABEGH 11
SQL> ALTER TABLE milad.savabegh MOVE PARTITION SAVABEGH_Q1 COMPRESS;
Table altered
SQL> select f.partition_name, f.segment_type,f.segment_name, bytes/1024/1024 ” size in MB ” from dba_segments f where f.segment_name=’SAVABEGH’ ;
PARTITION_NAME SEGMENT_TYPE SEGMENT_NAME size in MB
———————– ————— ————— ————
SAVABEGH_Q1 TABLE PARTITION SAVABEGH 19
SAVABEGH_Q2 TABLE PARTITION SAVABEGH 11