وبلاگ امیررضا رستنده

نکاتی در ارتباط با دیتابیس اوراکل و لینوکس

وبلاگ امیررضا رستنده

نکاتی در ارتباط با دیتابیس اوراکل و لینوکس

  • ۰
  • ۰

قابلیت Attribute clustering

این قابلیت در نسخه 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 وجود دارد:

  1. Attribute clustering with linear ordering

  2. 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 به میزان قابل توجهی کاهش پیدا کردند.

 

  • ۹۸/۰۶/۲۳
  • امیررضا رستنده

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی