اوراکل 19c – ارائه گزارش برای استفاده از hintها(HINT_REPORT)

زمانی که از چند HINT در متن دستور(مخصوصا یک پرس و جوی پیچیده) استفاده می کنیم، ممکن است در جستجوی روشی باشیم تا از استفاده اوراکل از این HINTها اطمینان حاصل کنیم و یا به صورت کلی بدانیم که از کدام یک از این hintها صرف نظر شده و چند hint مورد استفاده قرار گرفته است؟

قابلیت ساده و جدیدی در اوراکل 19c به این جهت ارائه شد که می توان از طریق آن، گزارشی را در زمان مطالعه execution plan در مورد حرف شنوی optimizer از hintهای موجود در متن دستور، مشاهده کرد. مثال زیر را ببینید.

مثال: برای نمایش این قابلیت، جدولی را ایجاد می کنیم و اطلاعاتی را در آن درج می کنیم:

create table mytbl(id number,name varchar2(100),last_name varchar2(100));

Table created.

insert into mytbl values(1,’VAHID’,’USEFZADEH’);

1 row(s) inserted.

Commit;

Statement processed.

قصد داریم برای خواندن جدول mytbl از parallel hint و همچنین FULL hint استفاده کنیم در ادامه با مطالعه execution plan دستور، بررسی می کنیم که آیا در زمان رجوع به جدول مورد نظر، از این hintها استفاده می شود یا خیر؟

explain plan for select /*+FULL(a) paralell(10)*/ * from mytbl a;

Statement processed.

SELECT * FROM table(DBMS_XPLAN.DISPLAY(FORMAT=>’BASIC +HINT_REPORT‘));

در خروجی دستور قبلی، قابل مشاهده است، که از هر دو hintی که در متن دستور قرار دارد، استفاده می شود:

Hint Report (identified by operation id / Query Block Name / Object Alias):

Total hints for statement: 2

حال برای آشنایی بیشتر با اصطلاحات تخصصی این گزارش، از هینتهای دیگری استفاده می کنیم.

فرض کنید به اشتباه عبارت “parallel” را در متن دستور وارد کرده ایم، همچنین از hintهای index و  use_nl هم استفاده می کنیم، چه تغییری در گزارش قبلی اتفاق خواهد افتاد؟

explain plan for select /*+FULL(a) use_nl(a) use_nl(mm) index(a) paralell(10)*/ * from mytbl a;

Statement processed.

SELECT * FROM table(DBMS_XPLAN.DISPLAY(FORMAT=>’BASIC +HINT_REPORT‘));

همانطور که در خروجی دستور قابل مشاهده است، به جهت Syntax error از parallel hint استفاده نشده است همچنین بین دو hint،ه FULL و INDEX هم کانفلیکت وجود دارد و با توجه به اینکه از عمل join در این دستور خبری نبوده، پس استفاده از (use_nl(a هم بی معنی و بلاستفاده خواهد بود همچنین به کاربردن هینت (use_nl(mm هم در این دستور، اساسا بی معنی می باشد:

Hint Report (identified by operation id / Query Block Name / Object Alias):

Total hints for statement: 5 (U – Unused (3), N – Unresolved (1), E – Syntax error (1))

—————————————————————————————

   1 –  SEL$1

         N –  use_nl(mm)

         E –  paralell

   1 –  SEL$1 / A@SEL$1

         U –  FULL(a) / hint conflicts with another in sibling query block

         U –  index(a) / hint conflicts with another in sibling query block

         U –  use_nl(a)©

Comments (2)

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

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