Використання подання v $ object_usage, Інші СУБД, Бази даних, статті

Цей короткий випуск, зокрема, присвячений застосуванню подання v$object_usage для контролю використання індексу. За мотивами цікавою публікації на сайті Тома Кайта.

Сподіваюся, регулярний вихід розсилки тепер поновиться. Перерва майже на місяць був викликаний необхідністю терміново створювати навчальні матеріали для курсу з адміністрування Oracle 8i … Тепер робота ця закінчена. Можливо, деякі побічні результати будуть представлені і в цій розсилці. Багато у мене в голові при цьому прояснилося.


Використання v $ object_usage


Том!

Контролювати використання індексу в Oracle 9i можна, виконавши спочатку оператор alter index xxx monitoring usage, Початківця процес збору відповідної інформації, а потім виконуючи запити до подання v$object_usage. Які оператори DDL або DML при цьому будуть генерувати “YES“В стовпчику”USED“Цього подання? Друкгімі словами, чи будуть оператори”select“Вважатися використовують індекс, або тільки update?..


Відповідь Тома Кайта


Стовпець буде мати значення YES, Якщо індекс використовувався для ДОСТУПУ до таблиці, – будь-то при зміні, злиття (merge), Видаленні рядків або при виконанні оператора SELECT. Цей стовпець змінюється не тому, що “змінена” якась запис індексу – це буде відбуватися при кожній вставці. Стовпець встановлюється в YES, Коли індекс використовується для доступу до таблиці.


Розглянемо приклад

ops$tkyte@ORA920.US.ORACLE.COM> create table t ( x int,
2 constraint t_pk primary key(x) );

Table created.

ops$tkyte@ORA920.US.ORACLE.COM> insert into t
2 select rownum
3 from all_objects
4 where rownum <= 100
5 /

100 rows created.

ops$tkyte@ORA920.US.ORACLE.COM> set echo off


Тепер включимо моніторинг індексу:

ops$tkyte@ORA920.US.ORACLE.COM> select index_name, monitoring, used, start_monitoring, end_monitoring
2 from v$object_usage;

no rows selected

ops$tkyte@ORA920.US.ORACLE.COM> alter index t_pk monitoring usage
2 /

Index altered.

ops$tkyte@ORA920.US.ORACLE.COM> select index_name, monitoring, used, start_monitoring, end_monitoring
2 from v$object_usage;

INDEX_NAME MONITORING USED START_MONITORING END_MONITORING
———— ———- —- ——————- ——————-
T_PK YES NO 10/05/2003 18:29:16

ops$tkyte@ORA920.US.ORACLE.COM>
ops$tkyte@ORA920.US.ORACLE.COM> set echo off


При використанні оптимізатора, заснованого на правилах (RBO), як воно і буде за замовчуванням, вибірка count(*) йде не через індекс:


ops$tkyte@ORA920.US.ORACLE.COM> set autotrace on explain
ops$tkyte@ORA920.US.ORACLE.COM> select count(*) from t;

COUNT(*)
———-
100

Execution Plan
———————————————————-
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF “T”

ops$tkyte@ORA920.US.ORACLE.COM> set autotrace off
ops$tkyte@ORA920.US.ORACLE.COM> select index_name, monitoring, used, start_monitoring, end_monitoring
2 from v$object_usage;

INDEX_NAME MONITORING USED START_MONITORING END_MONITORING
———— ———- —- ——————- ——————-
T_PK YES NO 10/05/2003 18:29:16

ops$tkyte@ORA920.US.ORACLE.COM> set echo off


Як і виконання оператора insert:

ops$tkyte@ORA920.US.ORACLE.COM> insert into t values (-1);

1 row created.

ops$tkyte@ORA920.US.ORACLE.COM> select index_name, monitoring, used, start_monitoring, end_monitoring
2 from v$object_usage;

INDEX_NAME MONITORING USED START_MONITORING END_MONITORING
———— ———- —- ——————- ——————-
T_PK YES NO 10/05/2003 18:29:16

ops$tkyte@ORA920.US.ORACLE.COM> set echo off


Але якщо проаналізувати таблицю, при вибірці count(*) індекс буде використовуватися, і ми отримаємо відповідну запис:

ops$tkyte@ORA920.US.ORACLE.COM> analyze table t compute statistics
2 /

Table analyzed.

ops$tkyte@ORA920.US.ORACLE.COM> set autotrace on explain
ops$tkyte@ORA920.US.ORACLE.COM> select count(*) from t;

COUNT(*)
———-
101

Execution Plan
———————————————————-
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1)
1 0 SORT (AGGREGATE)
2 1 INDEX (FULL SCAN) OF “T_PK” (UNIQUE) (Cost=2 Card=101)

ops$tkyte@ORA920.US.ORACLE.COM> set autotrace off
ops$tkyte@ORA920.US.ORACLE.COM> select index_name, monitoring, used, start_monitoring, end_monitoring
2 from v$object_usage;

INDEX_NAME MONITORING USED START_MONITORING END_MONITORING
———— ———- —- ——————- ——————-
T_PK YES YES 10/05/2003 18:29:16

ops$tkyte@ORA920.US.ORACLE.COM>

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*