четверг, 9 июля 2009 г.

Каркасные планы выполнения и их применение в практике

на тестовом сервере:

SQL> connect system as sysdba
SQL> @e:\oracle\ora92\rdbms\admin\dbmsol.sql

SQL> grant create any outline to LOGIN;
SQL> grant execute on dbms_outln to LOGIN;
SQL> grant execute on dbms_outln_edit to LOGIN;
SQL> ALTER SYSTEM SET CREATE_STORED_OUTLINES = TRUE;

далее параллельно запускаем проблеммное приложение, заставляем его делать проблеммные запросы
после этого:

SQL> ALTER SYSTEM SET CREATE_STORED_OUTLINES = FALSE

проконтроллировать полученные каркасные планы и хинты можно так:
select * from user_outlines;
select * from user_outline_hints;
название конкретно нужного плана можно посмотреть по user_outlines.sql_text

далее необходимо править хинты у полученных каркасных планов:
подготовка:
SQL> connect LOGIN
SQL> execute dbms_outln_edit.create_edit_tables;

копирование в приватный каркасный план (править можно только его):
SQL> create private outline priv_outln1 from SYS_OUTLINE_081007125758140;
SQL> column hint# format 999999
SQL> column hint_text format a28
SQL> column user_table_name format a16
SQL> set pages 1000
SQL> select hint#, hint_text, user_table_name from ol$hints where ol_name = 'PRIV_OUTLN1';

HINT# HINT_TEXT USER_TABLE_NAME
------- ---------------------------- ----------------
1 NOREWRITE
2 RULE
3 NOREWRITE
4 NO_EXPAND
5 USE_NL(LR)
6 USE_NL(CT)
7 USE_NL(LZ)
8 USE_NL(CN
9 ORDERED
10 NO_FACT(LR)
11 NO_FACT(CT)
12 NO_FACT(LZ)
13 NO_FACT(CN
14 NO_FACT(CX)
15 AND_EQUAL(CX M2_CTSXR_LTTLZ_FRGN M2_CTSRX_LTTPN_FRGN)
16 INDEX(CN M2_CITNM_PK)
17 INDEX(LZ M2_LTZON_PK)
18 INDEX(CT M2_CTS_PK)
19 INDEX(LR M2_LTMTSRG_PK)

SQL> update ol$hints set hint_text='USE_HASH(LR)' where hint# = 5;
SQL> update ol$hints set hint_text='USE_HASH(CT)' where hint# = 6;
SQL> update ol$hints set hint_text='USE_HASH(LZ)' where hint# = 7;
SQL> update ol$hints set hint_text='USE_HASH(CN)' where hint# = 8;
SQL> select hint#, hint_text, user_table_name from ol$hints where ol_name = 'PRIV_OUTLN1';

HINT# HINT_TEXT USER_TABLE_NAME
------- ---------------------------- ----------------
1 NOREWRITE
2 RULE
3 NOREWRITE
4 NO_EXPAND
5 USE_HASH(LR)
6 USE_HASH(CT)
7 USE_HASH(LZ)
8 USE_HASH(CN)
9 ORDERED
10 NO_FACT(LR)
11 NO_FACT(CT)
12 NO_FACT(LZ)
13 NO_FACT(CN)
14 NO_FACT(CX)
15 AND_EQUAL(CX M2_CTSXR_LTTLZ_FRGN M2_CTSRX_LTTPN_FRGN)
16 INDEX(CN M2_CITNM_PK)
17 INDEX(LZ M2_LTZON_PK)
18 INDEX(CT M2_CTS_PK)
19 INDEX(LR M2_LTMTSRG_PK)

SQL> commit;
SQL> execute dbms_outln_edit.refresh_private_outline('PRIV_OUTLN1');

копируем приватный обратно в общий:
SQL> create or replace outline SYS_OUTLINE_081007125758140 from private priv_outln1;

переименовываем и перекидываем в другую группу (для переноса на ПРОД):
SQL> alter outline SYS_OUTLINE_081007125758140 rename to taraandr001;
SQL> alter outline taraandr001 change category to TARAANDR;

и очистим дефолтную группу, дабы не мешалось:
SQL> exec outln_pkg.drop_by_cat('DEFAULT');

проконтроллируем, что остались только нужные:
select * from user_outlines;

далее переносим с ТЕСТа:
exp system/ file=myoutln.dmp tables=(outln.ol$,outln.ol$hints,outln.ol$nodes) statistics=none
на ПРОД:
imp system/ file=myoutln.dmp full=y ignore=y

и далее на ПРОДе включаем использование:
SQL> alter system set use_stored_outlines = TARAANDR;

используются до следующего рестарта базы.
для постояшного включения при перезагрузке (используется категория DEFAULT):
create or replace trigger enable_outlines_trig
after startup on database
begin
execute immediate('alter system set use_stored_outlines=true');
end;

67536.1 Stored Outline Quick Reference
144194.1 Editing Stored Outlines in Oracle9i - an example
728647.1 How to Transfer Stored Outlines from One Database to Another (9i and above)
560331.1 How to Enable USE_STORED_OUTLINES Permanently

дополнительно:
132547.1 Using Stored Outlines

Ярлыки