این قابلیت در نسخه 12.1.0.2 (Enterprise) اضافه شد. این قابلیت در واقع یک property برای جداول است و مشخص می کند که سطرها با چه ترتیبی و چگونه باید کنار هم (به صورت فیزیکی) بر اساس مقادیر یک یا چند ستون دسته بندی و ذحیره شوند.
(توجه کنید که این قابلیت با Table Cluster تفاوت دارد)
با این کار اطلاعاتی که به طور متناوب آنها را با هم می خواهیم در بلاک های پشت سر هم ذخیره می شوند و بنابراین باعث افزایش چشمگیر سرعت اجرای دستورات خواهیم بود.
حتی اگر بر بر روی جدول ایندکس هم داشته باشیم، پراکندگی اطلاعات ذخیره شده روی دیسک (که در جداول heap تقریباً همیشگی است) باعث افزایش میزان I/O و در نتیجه افزایش cost و کاهش سرعت اجرای دستورات خواهد بود.
همانطور که می دانید در حالت عادی هر بلاک ممکن است شامل چند سطر از جدول باشد. حالا اگر سطرهای مرتبط با هم در یک بلاک یا بلاک های پشت سر هم قرار بگیرند شاهد کاهش I/O در زمان select خواهیم بود.
همچنین این قابلیت موجب بهبود وضعیت index clustering factor خواهد شد.
با استفاده از قابلیت Attribute clustering به طور خودکار در زمان لود دیتا و بدون نیاز به دخالت ادمین دیتابیس رکوردهای متناظر در کنار هم خواهند بود.
این ویژگی را می توان برای یک جدول یا join بین دو جدول که دارای رابطه parent-child دارند استفاده کرد (Join Attribute clustering)
برای استفاده از این ویژگی، می توان آن را در زمان ایجاد جدول ذکر کرد و یا با دستور alter table، آن را فعال نمود. ولی توجه داشته باشید که اگر clustering جدول فعال نباشد و پس از ایجاد جدول این ویژگی را فعال کنید، برای سطرهایی که از قبل وجود داشته اند این ویژگی کار نمی کند و باید برای این کار باید از دستور move استفاده نماییم.
دو روش برای استفاده از Attribute clustering وجود دارد:
Attribute clustering with linear ordering
Attribute clustering with interleaved ordering
که روش اول حالت پیش فرض است و در این روش اطلاعات به ترتیب ستون های مشخص شده ذخیره می شوند.
توجه کنید که بهترین عملکرد را در حالتی خواهیم داشت که در شرط where ستون یا ستون های cluster شده را داشته باشیم و یا اولین ستون مشخص شده در cluster attribute در شرط دستورات وجود داشته باشد.
در ادامه این قابلیت با مثال توضیح داده خواهد شد:
SQL> drop table clusterd_tbl purge;
SQL> CREATE TABLE clusterd_tbl (first_id NUMBER(10), second_id NUMBER(10));
SQL> INSERT /*+nologging append parallel*/ INTO clusterd_tbl
SELECT ROWNUM, MOD(ROWNUM,1000) FROM dual
CONNECT BY LEVEL <= 10000000;
SQL> commit;
SQL> select count(*) from clusterd_tbl;
SQL> EXEC dbms_stats.gather_table_stats(ownname=>NULL, tabname=>'clusterd_tbl');
SQL> CREATE INDEX clusterd_tbl_idx ON clusterd_tbl (second_id);
--in sqlplus
SQL> alter system flush buffer_cache;
SQL> alter system flush shared_pool;
SQL> set autotrace traceonly statistics
SQL> SELECT COUNT(DISTINCT first_id) FROM ara.clusterd_tbl
WHERE second_id = 50;
آمار مربوط به اولین اجرا:
Statistics
----------------------------------------------------------
151 recursive calls
7 db block gets
20739 consistent gets
20582 physical reads
1084 redo size
556 bytes sent via SQL*Net to client
608 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
12 sorts (memory)
0 sorts (disk)
1 rows processed
آمار مربوط به دومین اجرا:
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
20572 consistent gets
0 physical reads
0 redo size
556 bytes sent via SQL*Net to client
608 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
آمار مربوط به سومین اجرا:
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
20572 consistent gets
0 physical reads
0 redo size
556 bytes sent via SQL*Net to client
608 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> alter system flush buffer_cache;
SQL> alter system flush shared_pool;
حالا قابلیت clustering را فعال می کنیم:
SQL> ALTER TABLE clusterd_tbl ADD CLUSTERING BY LINEAR ORDER (second_id) WITHOUT MATERIALIZED ZONEMAP;
SQL> alter table clusterd_tbl move;
SQL> alter index clusterd_tbl_idx rebuild;
SQL> SELECT COUNT(DISTINCT first_id) FROM ara.clusterd_tbl
WHERE second_id = 50;
آمار مربوط به اولین اجرا:
Statistics
----------------------------------------------------------
3 recursive calls
0 db block gets
50 consistent gets
32 physical reads
132 redo size
556 bytes sent via SQL*Net to client
608 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
آمار مربوط به دومین اجرا:
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
42 consistent gets
0 physical reads
0 redo size
556 bytes sent via SQL*Net to client
608 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
آمار مربوط به سومین اجرا:
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
42 consistent gets
0 physical reads
0 redo size
556 bytes sent via SQL*Net to client
608 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
همانطور که در مثال بالا مشخص است با داشتن قابلیت Attribute clustering آمار physical reads و consistent gets به میزان قابل توجهی کاهش پیدا کردند.
- ۹۸/۰۶/۲۳