اوراکل 23c – تخمین صرفه جویی در فضا با DEDUPLICATION

DEDUPLICATION یکی از قابلیتهای جدید اوراکل در نسخه 11g است که همراه با SECUREFILE LOBها ارائه شد و می توان بعد از ایجاد جدول هم این قابلیت را برای SECUREFILE LOBها فعال کرد اما سوال مهمی که در این زمینه مطرح می شود آن است که DEDUPLICATION برای LOBهای موجود چقدر فضا آزاد می کند؟

در اوراکل نسخه 23c، تابعی در این زمینه ارائه شد که می تواند تا حدودی به این سوال پاسخ دهد. این تابع نام جدول(و یا نام پارتیشنی از جدول) را دریافت می کند و حداکثر 100 هزار رکورد از آن جدول را بررسی کرده و نهایتا تخمینی از میزان ذخیره سازی فضا را ارائه می کند.

در ادامه، سناریوی تستی را در این زمینه می بینید.

SQL> create table tbl (id number,describe clob);
Table created

در این جدول اطلاعاتی را درج می کنیم که بیشتر آن تکراری هستند:

SQL> begin
  2    for i in 1 .. 70000 loop
  3      insert into tbl
  4      values
  5        (1,
  6         lpad('www.usefzadeh.com',
  7              1000000000000000000000000000000000000000000000000000000000000000000000000000000000,
  8              'a'));
  9    end loop;
 10    insert into tbl values (2, 'Ramtollah Rabbani');
 11    insert into tbl values (3, 'Armin Bahamin');
 12    insert into tbl values (4, 'Jamshid Khan');
 13    commit;
 14  end;
 15  /

PL/SQL procedure successfully completed

تعداد رکوردهای جدول:

SQL> select count(*) from tbl;
  COUNT(*)
----------
     70003

برای محاسبه تخمین میزان فضای صرفه جویی شده پس از DEDUPLICATION، تابع dbms_lob.GET_LOB_DEDUPLICATION_RATIO را اجرا می کنیم:

SQL> set serverout on
SQL> DECLARE
  dedup_ratio number;
BEGIN
  dedup_ratio := dbms_lob.GET_LOB_DEDUPLICATION_RATIO(
  tablespacename => 'TBS_ETTELAAT',
    tabowner       => 'USEF',
    tabname        => 'TBL',
    lobcolumnname  => 'DESCRIBE',
    partname       => '',
    dedup_ratio    => dedup_ratio,
    subset_numrows => 70003);
  dbms_output.put_line('Deduplication ratio: ' || dedup_ratio);
END;
/
Deduplication ratio: 69272.6476991588322612568035625927758535
PL/SQL procedure successfully completed

DEDUPLICATE Ratio برابر با 69272 تخمین زده شده است. مجموع رکوردهای جدول برابر با 70003 است. حجم LOB هم برابر با 608 مگابایت است:

SQL> select round(bytes/1024/1024) SIZE_MB,segment_name from user_segments where segment_name='SYS_LOB0000078029C00002

در نهایت DEDUPLICATE را برای این LOB فعال می کنیم تا ببینیم چقدر فضا صرفه جویی شده است:

SQL> ALTER TABLE TBL MOVE LOB(DESCRIBE) STORE AS SECUREFILE(DEDUPLICATE);
Table altered
SQL> select round(bytes/1024/1024) SIZE_MB,segment_name from user_segments where segment_name='SYS_LOB0000078029C00002

فضا از 608 مگابایت به 1 مگابایت کاهش پیدا کرده است.


   SIZE_MB SEGMENT_NAME
---------- ----------------------------
       608 SYS_LOB0000078029C00002$

ارائه خدمات مشاوره ، پشتیبانی و نصب و راه اندازی پایگاه داده اوراکل در سراسر کشور...................... تلفن: 09128110897 ایمیل:vahidusefzadeh@gmail.com

Comments (2)

  1. سلام و خداقوت
    استاد این متن چندین بار تکرار شده است اصلاح بفرمایید
    “در نهایت DEDUPLICATE را برای این LOB فعال می کنیم تا ببینیم چقدر فضا صرفه جویی شده است:”

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *