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$
سلام و خداقوت
استاد این متن چندین بار تکرار شده است اصلاح بفرمایید
“در نهایت DEDUPLICATE را برای این LOB فعال می کنیم تا ببینیم چقدر فضا صرفه جویی شده است:”
تشکر مهندس