فشرده سازی جداول در اوراکل(TABLE COMPRESSION)

در دیتابیس های اوراکل نگارش 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                                                                         

 

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

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