بهبودی در جمع آوری خودکار آمار در اوراکل 19c

در محیطهای که نرخ تغییر داده نسبتا زیاد است، شاید استفاده از آمارهای بروز شده از طریق automated maintenance taskهای شبانه، چندان کارا نباشد با این نگاه، اوراکل در نسخه 19c، قابلیتهای جدیدی را در زمینه جمع آوری و بروزرسانی خودکار Statistic ارائه کرده که قبلا در مقاله ای یکی از این قابلیتها را که Real-time Statistic نام داشت، مورد بررسی قرار دادیم.

در این مقاله قصد داریم به یکی دیگر از این قابلیتها که High-frequency Optimizer Statistics Collection نام دارد، بپردازیم.

با کمک این قابلیت جدید اوراکل 19c، می توان در بازه های زمانی مشخصی، جداولی که آمارشان در حالت stale قرار می گیرد را بروزسانی کرد. البته به صورت پیش فرض این قابلیت غیرفعال می باشد.

برای مشاهده وضعیت فعلی این قابلیت، می توان از دستور زیر استفاده کرد:

SQL> select dbms_stats.get_prefs(‘AUTO_TASK_STATUS‘) “enable/disable” from dual;

enable/disable

—————–

OFF

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

SQL> exec dbms_stats.set_global_prefs(‘AUTO_TASK_STATUS‘,’ON‘)

PL/SQL procedure successfully completed

SQL> select dbms_stats.get_prefs(‘AUTO_TASK_STATUS’) “enable/disable” from dual;

enable/disable

—————-

ON

توجه: این قابلیت صرفا در محیط exadata قابل استفاده است:

SQL> alter system set “_exadata_feature_on”=true scope=spfile;

System altered.

بصورت پیش فرض، AUTO_TASK مربوط به این قابلیت، در بازه زمانی 900 ثانیه اجرا می شود:

SQL>  select dbms_stats.get_prefs(‘AUTO_TASK_INTERVAL‘)  AUTO_TASK_INTERVAL from dual;

AUTO_TASK_INTERVAL

——————————————————————————–

900

با اجرای دستور زیر، interval از 900 ثانیه به 100 ثانیه تغییر خواهد کرد:

SQL> exec dbms_stats.set_global_prefs(‘AUTO_TASK_INTERVAL‘,’500’)

PL/SQL procedure successfully completed

 همچنین زمان اجرای AUTO_TASK، در هربار اجرا نمی تواند بیشتر از 3600 ثانیه باشد(به صورت پیش فرض):

SQL>  select dbms_stats.get_prefs(‘AUTO_TASK_MAX_RUN_TIME’) AUTO_TASK_MAX_RUN_TIME from dual;

AUTO_TASK_MAX_RUN_TIME

———————–

3600

با اجرای دستور زیر، این عدد به 600 ثانیه تغییر خواهد کرد:

SQL> exec dbms_stats.set_global_prefs(‘AUTO_TASK_MAX_RUN_TIME’,’600′)

PL/SQL procedure successfully completed

توجه: با رجوع به جدول $OPTSTAT_HIST_CONTROL می توان اسامی و مقادیر پارامترهای دیگر مرتبط به این قابلیت نظیر STALE_PERCENT، PUBLISH، CASCADE و … را مشاهده کرد.

select sname,spare4 from sys.OPTSTAT_HIST_CONTROL$;

بعد از بررسی و یا انجام این تنظیمات، برای نمایش کیفیت این قابلیت، سناریوی ساده ای را طراحی می کنیم.

ابتدا جدولی را از روی ساختار جدول $source ایجاد می کنیم:

SQL> create table mytbl as select * from sys.source$ where 1=2;

Table created

با قابلیتی که از اوراکل 12c اضافه شد، با اجرای دستور CTAS، بصورت خودکار برای جداولی که به تازگی ایجاد می شوند، آماری ثبت خواهد شد:

SQL> select num_rows,blocks from dba_tables k where k.TABLE_NAME=’MYTBL’;

  NUM_ROWS     BLOCKS

———- ———-

         0          0

از خروجی دستور زیر هم می توان فهمید که آمار جدول mytbl در حالت stale قرار ندارد:

SQL> select t.stale_stats from dba_tab_statistics t where table_name=’MYTBL’;

STALE_STATS

———–

NO

قصد داریم اطلاعاتی را در این جدول درج کنیم تا آمار موجود از این جدول در حالت stale قرار بگیرد:

SQL> insert into mytbl select * from sys.source$;

295528 rows inserted

SQL> commit;

Commit complete

با درج این اطلاعات، آمار ثبت شده از این جدول بروزرسانی نخواهد شد:

SQL> select num_rows,blocks from dba_tables k where k.TABLE_NAME=’MYTBL’;

  NUM_ROWS     BLOCKS

———- ———-

         0          0

و وضعیت آمار این جدول، در حالت stale قرار می گیرد:

SQL> select t.stale_stats from dba_tab_statistics t where table_name=’MYTBL’;

STALE_STATS

———–

YES

با تنظیماتی که در ابتدا انجام شد، قرار بود با گذشت 100 ثانیه(بر اساس زمانی که برای خصوصیت ‘AUTO_TASK_INTERVAL’ تنظیم شده) از جداولی که آمارشان در حالت stale قرار دارد، آماری جمع آوری شود.

بعد از گذشت زمان تعیین شده، خواهیم دید که آمار مربوط به جدول mytbl بروزرسانی شده و از حالت stale خارج شده است:

SQL> select t.stale_stats from dba_tab_statistics t where table_name=’MYTBL’;

STALE_STATS

———–

NO

SQL> select num_rows,blocks from dba_tables k where k.TABLE_NAME=’MYTBL’;

  NUM_ROWS     BLOCKS

———- ———-

    295528       4780

زمان اجرای AUTO_TASK را می توان با پرس و جوی زیر مشاهده کرد.

select start_time, end_time, failed, timed_out, origin from DBA_AUTO_STAT_EXECUTIONS;

 

همچنین با رجوع به جدول atsk$_schedule_control می توان اطلاعات بیشتری را در مورد اخرین اجرای این قابلیت مشاهده کرد:

select dbid, atskid,mrct_task_time, interval, suspendable_time,status, num_failure, max_run_time, enable ,last_exec_instnum, mrct_task_time_tz, duration   from  sys.atsk$_schedule_control;

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

Comment (1)

پاسخی بگذارید

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