日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Oracle adviser,Oracle10g SQL tune adviser

發(fā)布時(shí)間:2023/12/9 数据库 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle adviser,Oracle10g SQL tune adviser 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Oracle10g SQL tune adviser簡(jiǎn)單介紹

本文簡(jiǎn)單介紹下SQL Tuning Adviser的配置使用方法和一些相關(guān)知識(shí)點(diǎn),如果了解SQL Tuning Adviser詳細(xì)信息,參看Oracle聯(lián)機(jī)文檔。本文對(duì)分析結(jié)果沒(méi)有詳細(xì)分析。

一、自動(dòng)SQL Tuning簡(jiǎn)單介紹:

1、優(yōu)化模式:

10G增強(qiáng)的優(yōu)化模式有兩種:

a、Normal mode

在普通優(yōu)化模式下,優(yōu)化器編譯sql然后產(chǎn)生執(zhí)行計(jì)劃。普通優(yōu)化模式下優(yōu)化器能夠快速的為sql語(yǔ)句產(chǎn)生可行的執(zhí)行計(jì)劃。

b、Tuning mode

在tuning mode模式下,優(yōu)化器將花費(fèi)額外的時(shí)間檢查一個(gè)普通模式下產(chǎn)生的執(zhí)行計(jì)劃是否可以優(yōu)化。優(yōu)化器的輸出結(jié)果將不僅僅是產(chǎn)生一個(gè)執(zhí)行計(jì)劃,

而將執(zhí)行一系列的動(dòng)作,在該模式下優(yōu)化器也許化肥幾分鐘去調(diào)整一個(gè)語(yǔ)句。每次一個(gè)sql語(yǔ)句被硬解析后將在自動(dòng)調(diào)整優(yōu)化上花費(fèi)更多的時(shí)間和資源。

sql自動(dòng)調(diào)整優(yōu)化更適用于有復(fù)雜sql或者h(yuǎn)igh-load sql的系統(tǒng)(例如addm中標(biāo)記為高負(fù)載的sql就非常適合作為sql自動(dòng)調(diào)整的目標(biāo))。

2、? ? ? ? SQL Tuning類(lèi)型

Automatic SQL Tuning包含四種類(lèi)型的分析:

a、Statistics Analysis

b、SQL Profiling

c、Access Path Analysis

d、SQL Structure Analysis

二、SQL Tuning Adviser:

1、授予用戶相應(yīng)權(quán)限:

CONN sys/password AS SYSDBA

GRANT ADVISOR TO TEST;

CONN TEST/TEST

2、創(chuàng)建Tuning任務(wù):

可以通過(guò)以下方式創(chuàng)建Tuning任務(wù):

a、Automatic Workload Repository (AWR)

b、the cursor cache

c、SQL tuning set

d、specified manually

SET SERVEROUTPUT ON

--a、通過(guò)AWR設(shè)置Tuning任務(wù).

SQL> conn /as sysdba

已連接。

--查看AWR的SNAPSHOT信息:

SQL> SELECT max(snap_id) FROM WRM$_SNAPSHOT;

MAX(SNAP_ID)

------------

201

--查看SNAP間隔:

SQL> select snap_interval, retention from dba_hist_wr_control;

SNAP_INTERVAL? ?? ?? ?? ?? ?? ?RETENTION

------------------------------ ------------------------------

+00000 01:00:00.0? ?? ?? ?? ???+00007 00:00:00.0

--我們可以手工縮短AWR采樣時(shí)間間隔(加快測(cè)試速度,本利采用手工執(zhí)行創(chuàng)建SNAPSHOT的方法):

begin

dbms_workload_repository.modify_snapshot_settings (

interval => 10,

retention => 10*24*60

);

end;

SQL> conn test/test

已連接。

--執(zhí)行目標(biāo)SQL:

SQL> select /*We will trace this sql*/ name,addr,insertdata from (select name,ad

dr,insertdata,rank() over(partition by name,addr order by insertdata desc) rn fr

om t ) where rn = 1;

NAME? ?? ? ADDR? ?? ?? ?? ?? ???INSERTDATA

---------- -------------------- -------------------

王? ?? ?? ?上海? ?? ?? ?? ?? ???19-12-2006 10:09:33

王1? ?? ???上海? ?? ?? ?? ?? ???16-12-2006 10:11:15

王2? ?? ???上海? ?? ?? ?? ?? ???16-12-2006 10:11:15

張? ?? ?? ?北京? ?? ?? ?? ?? ???19-12-2006 10:08:42

--查找SQL_ID:

SQL> select sql_id,executions from v$sqlarea where lower(sql_text) like '%we wil

l trace this sql%';

SQL_ID? ?? ???EXECUTIONS

------------- ----------

8zu31x4adn76f? ?? ?? ? 1

1k659753fzcxn? ?? ?? ? 1

SQL> /

SQL_ID? ?? ???EXECUTIONS

------------- ----------

8zu31x4adn76f? ?? ?? ? 2

1k659753fzcxn? ?? ?? ? 1? ?--我們將分析該SQL

SQL> select sql_id from DBA_HIST_SQLSTAT where sql_id='1k659753fzcxn';

未選定行

--手工創(chuàng)建新的AWR SNAPSHOT:

SQL> execute dbms_workload_repository.create_snapshot;

PL/SQL 過(guò)程已成功完成。

SQL> select sql_id from DBA_HIST_SQLSTAT where sql_id='1k659753fzcxn';

SQL_ID

-------------

1k659753fzcxn

--創(chuàng)建Tuning task:

SQL> DECLARE

2? ?? ?? ?? ?? ?l_sql_tune_task_id??VARCHAR2(100);

3? ?? ?? ?? ? BEGIN

4? ?? ?? ?? ?? ?l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task (

5? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?begin_snap??=> 201,

6? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?end_snap? ? => 202,

7? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?sql_id? ?? ?=> '1k659753fzcxn',

8? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?scope? ?? ? => DBMS_SQLTUNE.scope_comprehensive,

9? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?time_limit??=> 60,

10? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?task_name? ?=> '1k659753fzcxn_awr_tuning_task',

11? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?description => 'Tuning task for statement 1k659753fzcxn in AWR.');

12? ?? ?? ?? ?? ?DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id);

13? ?? ?? ?? ? END;

14??/

PL/SQL 過(guò)程已成功完成。

SQL> SELECT task_name, status FROM dba_advisor_log WHERE owner = 'TEST';

TASK_NAME? ?? ?? ?? ?? ?? ?? ? STATUS

------------------------------ -----------

ADDM:1184202927_1_201? ?? ?? ? COMPLETED

ADDM:1184202927_1_202? ?? ?? ? COMPLETED

1k659753fzcxn_awr_tuning_task??INITIAL

--執(zhí)行Tuning task:

SQL> EXEC DBMS_SQLTUNE.execute_tuning_task(task_name => '1k659753fzcxn_awr_tuning_task');

PL/SQL 過(guò)程已成功完成。

SQL> SET LONG 999999;

SQL> SET PAGESIZE 1000

SQL> SET LINESIZE 200

--查看Tuning advice:

SQL> SELECT DBMS_SQLTUNE.report_tuning_task('1k659753fzcxn_awr_tuning_task') AS recommendations FROM dual;

RECOMMENDATIONS

--------------------------------------------------------------------------------

GENERAL INFORMATION SECTION

-------------------------------------------------------------------------------

Tuning Task Name? ?? ?? ?? ?? ?? ?: 1k659753fzcxn_awr_tuning_task

Tuning Task Owner? ?? ?? ?? ?? ???: TEST

Scope? ?? ?? ?? ?? ?? ?? ?? ?? ???: COMPREHENSIVE

Time Limit(seconds)? ?? ?? ?? ?? ?: 60

Completion Status? ?? ?? ?? ?? ???: COMPLETED

Started at? ?? ?? ?? ?? ?? ?? ?? ?: 07/09/2008 22:40:27

Completed at? ?? ?? ?? ?? ?? ?? ? : 07/09/2008 22:40:28

-------------------------------------------------------------------------------

Schema Name: TEST

SQL ID? ???: 1k659753fzcxn

SQL Text? ?: select /*We will trace this sql*/ name,addr,insertdata from

(select name,addr,insertdata,rank() over(partition by name,addr

order by insertdata desc) rn from t ) where rn = 1

-------------------------------------------------------------------------------

ADDITIONAL INFORMATION SECTION

-------------------------------------------------------------------------------

-優(yōu)化程序不能合并位于執(zhí)行計(jì)劃的行 ID 1 處的視圖。.

-------------------------------------------------------------------------------

EXPLAIN PLANS SECTION

-------------------------------------------------------------------------------

1- Original

-----------

Plan hash value: 3047187157

--------------------------------------------------------------------------------

-

| Id??| Operation? ?? ?? ?? ?? ? | Name | Rows??| Bytes | Cost (%CPU)| Time

|

--------------------------------------------------------------------------------

-

|? ?0 | SELECT STATEMENT? ?? ?? ?|? ?? ?|? ???8 |? ?368 |? ???4??(25)| 00:00:01

|

|*??1 |??VIEW? ?? ?? ?? ?? ?? ???|? ?? ?|? ???8 |? ?368 |? ???4??(25)| 00:00:01

|

|*??2 |? ?WINDOW SORT PUSHED RANK|? ?? ?|? ???8 |? ?136 |? ???4??(25)| 00:00:01

|

|? ?3 |? ? TABLE ACCESS FULL? ???| T? ? |? ???8 |? ?136 |? ???3? ?(0)| 00:00:01

|

--------------------------------------------------------------------------------

-

Predicate Information (identified by operation id):

---------------------------------------------------

1 - filter("RN"=1)

2 - filter(RANK() OVER ( PARTITION BY "NAME","ADDR" ORDER BY

INTERNAL_FUNCTION("INSERTDATA") DESC )<=1)

-------------------------------------------------------------------------------

--中斷Tuning task:

EXEC DBMS_SQLTUNE.interrupt_tuning_task (task_name => '1k659753fzcxn_awr_tuning_task');

--繼續(xù)Tuning task:

EXEC DBMS_SQLTUNE.resume_tuning_task (task_name => '1k659753fzcxn_awr_tuning_task');

--取消Tuning task:

EXEC DBMS_SQLTUNE.cancel_tuning_task (task_name => '1k659753fzcxn_awr_tuning_task');

--重置Tuning task:

SQL> SELECT task_name, status FROM dba_advisor_log WHERE owner = 'TEST';

TASK_NAME? ?? ?? ?? ?? ?? ?? ? STATUS

------------------------------ -----------

ADDM:1184202927_1_201? ?? ?? ? COMPLETED

ADDM:1184202927_1_202? ?? ?? ? COMPLETED

1k659753fzcxn_awr_tuning_task??COMPLETED

SQL> EXEC DBMS_SQLTUNE.reset_tuning_task (task_name => '1k659753fzcxn_awr_tuning_task');

PL/SQL 過(guò)程已成功完成。

SQL> SELECT task_name, status FROM dba_advisor_log WHERE owner = 'TEST';

TASK_NAME? ?? ?? ?? ?? ?? ?? ? STATUS

------------------------------ -----------

ADDM:1184202927_1_201? ?? ?? ? COMPLETED

ADDM:1184202927_1_202? ?? ?? ? COMPLETED

1k659753fzcxn_awr_tuning_task??INITIAL

--刪除Tuning task:

SQL> BEGIN

2? ? DBMS_SQLTUNE.drop_tuning_task (task_name => '1k659753fzcxn_awr_tuning_task');

3??END;

4??/

PL/SQL 過(guò)程已成功完成。

SQL> SELECT task_name, status FROM dba_advisor_log WHERE owner = 'TEST';

TASK_NAME? ?? ?? ?? ?? ?? ?? ? STATUS

------------------------------ -----------

ADDM:1184202927_1_201? ?? ?? ? COMPLETED

ADDM:1184202927_1_202? ?? ?? ? COMPLETED

--b、通過(guò)cursor cache設(shè)置Tuning任務(wù).

--方法大致如下,這里我們就不再另外舉例了。

DECLARE

l_sql_tune_task_id??VARCHAR2(100);

BEGIN

l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task (

sql_id? ?? ?=> '1k659753fzcxn',

scope? ?? ? => DBMS_SQLTUNE.scope_comprehensive,

time_limit??=> 60,

task_name? ?=> '1k659753fzcxn_tuning_task',

description => 'Tuning task for statement 1k659753fzcxn.');

DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id);

END;

/

--c、通過(guò)SQL tuning set設(shè)置Tuning任務(wù).

我們可以創(chuàng)建調(diào)整SQL的集合:

SQL> CONN /AS SYSDBA

已連接。

SQL> GRANT ADMINISTER ANY SQL TUNING SET TO TEST;

授權(quán)成功。

SQL> CONN TEST/TEST

已連接。

SQL> BEGIN

2? ? DBMS_SQLTUNE.create_sqlset (

3? ?? ?sqlset_name??=> 'test_sql_tuning_set',

4? ?? ?description??=> 'A test SQL tuning set.');

5??END;

6??/

PL/SQL 過(guò)程已成功完成。

SQL> SELECT OWNER,NAME FROM DBA_SQLSET;

OWNER? ?? ?? ?? ?? ?? ?? ?? ???NAME

------------------------------ ------------------------------

TEST? ?? ?? ?? ?? ?? ?? ?? ?? ?test_sql_tuning_set

SQL> declare

2? ???cur dbms_sqltune.sqlset_cursor;

3??begin

4? ???open cur for select value(p) from table(dbms_sqltune.select_cursor_cache('parsing_schema_name = ''TEST'' ',null,null,null,null,1,null,'ALL')) P;

5? ???dbms_sqltune.load_sqlset(sqlset_name=>'test_sql_tuning_set',populate_cursor=>cur);

6??end;

7??/

PL/SQL 過(guò)程已成功完成。

SQL> select count(*) from table(dbms_sqltune.select_sqlset('test_sql_tuning_set'

, 'parsing_schema_name = ''TEST'' '));

COUNT(*)

----------

17

SQL> declare

2? ???my_task_name varchar2(30);

3??begin

4? ???my_task_name := dbms_sqltune.create_tuning_task(sqlset_name=>'test_sql_tuning_set',

5? ???time_limit=>600,

6? ???scope=>'COMPREHENSIVE',

7? ???task_name=>'test_tuning_task',

8? ???description=>'test tuning task');

9??end;

10??/

PL/SQL 過(guò)程已成功完成。

SQL> begin

2? ???dbms_sqltune.set_tuning_task_parameter(

3? ???task_name=> 'test_tuning_task',

4? ???parameter => 'TIME_LIMIT',

5? ???value=>800);

6??end;

7??/

PL/SQL 過(guò)程已成功完成。

SQL> exec dbms_sqltune.execute_tuning_task(task_name => 'test_tuning_task');

PL/SQL 過(guò)程已成功完成。

SQL> set long 999999

SQL> set longchunksize 1000

SQL> set linesize 200

SQL> select dbms_sqltune.report_tuning_task('test_tuning_task') from dual;

DBMS_SQLTUNE.REPORT_TUNING_TASK('TEST_TUNING_TASK')

-------------------------------------------------------------------------------------------------------------------------------

GENERAL INFORMATION SECTION

-------------------------------------------------------------------------------

Tuning Task Name? ?? ?? ?? ?? ?? ?: test_tuning_task

Tuning Task Owner? ?? ?? ?? ?? ???: TEST

Scope? ?? ?? ?? ?? ?? ?? ?? ?? ???: COMPREHENSIVE

Time Limit(seconds)? ?? ?? ?? ?? ?: 800

Completion Status? ?? ?? ?? ?? ???: COMPLETED

Started at? ?? ?? ?? ?? ?? ?? ?? ?: 07/10/2008 12:38:55

Completed at? ?? ?? ?? ?? ?? ?? ? : 07/10/2008 12:38:59

SQL Tuning Set (STS) Name? ?? ?? ?: test_sql_tuning_set

SQL Tuning Set Owner? ?? ?? ?? ???: TEST

DBMS_SQLTUNE.REPORT_TUNING_TASK('TEST_TUNING_TASK')

-------------------------------------------------------------------------------------------------------------------------------

Number of Statements in the STS? ?: 17

Number of Statements in the Report: 17

Number of Statements with Findings: 7

Number of Statistic Findings? ?? ?: 9

Number of SQL Profile Findings? ? : 2

Number of SQL Restructure Findings: 1

Number of Errors? ?? ?? ?? ?? ?? ?: 1

.........................................

.........................................

這里就不顯示分析結(jié)果了,上千行的分析結(jié)果。

和創(chuàng)建Tuning task類(lèi)似,select_sqlset也可以從AWR中獲得sql集合,也可拷貝其他集合。這里不再詳細(xì)介紹。

--d、通過(guò)manually specified statement設(shè)置Tuning任務(wù).

--沒(méi)有綁定變量的情況:

SQL> DECLARE

2? ? l_sql? ?? ?? ?? ?? ?VARCHAR2(500);

3? ? l_sql_tune_task_id??VARCHAR2(100);

4??BEGIN

5? ? l_sql := 'select /*We will trace this sql*/ name,addr,insertdata from

(select name,addr,insertdata,rank() over(partition by name,addr order by

insertdatadesc) rn from t ) where rn = 1';

7? ? l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task (

8? ?? ?? ?? ?? ?? ?? ?? ?? ? sql_text? ? => l_sql,

9? ?? ?? ?? ?? ?? ?? ?? ?? ? user_name? ?=> 'TEST',

10? ?? ?? ?? ?? ?? ?? ?? ?? ? scope? ?? ? => DBMS_SQLTUNE.scope_comprehensive,

11? ?? ?? ?? ?? ?? ?? ?? ?? ? time_limit??=> 60,

12? ?? ?? ?? ?? ?? ?? ?? ?? ? task_name? ?=> 'test_tuning_task',

13? ?? ?? ?? ?? ?? ?? ?? ?? ? description => 'Tuning task for an a simple query.');

14? ? DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id);

15??END;

16??/

PL/SQL 過(guò)程已成功完成。

SQL> EXEC DBMS_SQLTUNE.execute_tuning_task(task_name => 'test_tuning_task');

PL/SQL 過(guò)程已成功完成。

SQL> SELECT DBMS_SQLTUNE.report_tuning_task('test_tuning_task') AS recommendations FROM dual;

RECOMMENDATIONS

--------------------------------------------------------------------------------

GENERAL INFORMATION SECTION

-------------------------------------------------------------------------------

Tuning Task Name? ?? ?? ?? ?? ?? ?: test_tuning_task

Tuning Task Owner? ?? ?? ?? ?? ???: TEST

Scope? ?? ?? ?? ?? ?? ?? ?? ?? ???: COMPREHENSIVE

Time Limit(seconds)? ?? ?? ?? ?? ?: 60

Completion Status? ?? ?? ?? ?? ???: COMPLETED

Started at? ?? ?? ?? ?? ?? ?? ?? ?: 07/10/2008 01:17:09

Completed at? ?? ?? ?? ?? ?? ?? ? : 07/10/2008 01:17:09

Number of Statistic Findings? ?? ?: 1

RECOMMENDATIONS

--------------------------------------------------------------------------------

-------------------------------------------------------------------------------

Schema Name: TEST

SQL ID? ???: 3zdbsrhb1mhuq? ?--該處的sql_id顯示不正確,可能是oracle的一個(gè) bug

SQL Text? ?: select /*We will trace this sql*/ name,addr,insertdata from

(select name,addr,insertdata,rank() over(partition by name,addr

order by insertdata desc) rn from t ) where rn = 1

-------------------------------------------------------------------------------

FINDINGS SECTION (1 finding)

-------------------------------------------------------------------------------

RECOMMENDATIONS

--------------------------------------------------------------------------------

1- Statistics Finding

---------------------

尚未分析表 "TEST"."

Recommendation

--------------

- 考慮收集此表的優(yōu)

execute dbms_stats.gather_table_stats(ownname => 'TEST', tabname => 'T',

estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt =>

'FOR ALL COLUMNS SIZE AUTO');

RECOMMENDATIONS

--------------------------------------------------------------------------------

Rationale

---------

為了選擇好的執(zhí)行計(jì)劃, 優(yōu)化程序需

-------------------------------------------------------------------------------

ADDITIONAL INFORMATION SECTION

-------------------------------------------------------------------------------

-優(yōu)化程序不能合并位于執(zhí)行計(jì)劃的行 ID 1 處的視圖。.

-------------------------------------------------------------------------------

EXPLAIN PLANS SECTION

RECOMMENDATIONS

--------------------------------------------------------------------------------

-------------------------------------------------------------------------------

1- Original

-----------

Plan hash value: 3047187157

--------------------------------------------------------------------------------

| Id??| Operation? ?? ?? ?? ?? ? | Name | Rows??| Bytes | Cost (%CPU)| Time

--------------------------------------------------------------------------------

|? ?0 | SELECT STATEMENT? ?? ?? ?|? ?? ?|? ???8 |? ?368 |? ???4??(25)| 00:00:01

|*??1 |??VIEW? ?? ?? ?? ?? ?? ???|? ?? ?|? ???8 |? ?368 |? ???4??(25)| 00:00:01

RECOMMENDATIONS

--------------------------------------------------------------------------------

|*??2 |? ?WINDOW SORT PUSHED RANK|? ?? ?|? ???8 |? ?264 |? ???4??(25)| 00:00:01

|? ?3 |? ? TABLE ACCESS FULL? ???| T? ? |? ???8 |? ?264 |? ???3? ?(0)| 00:00:01

--------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - filter("RN"=1)

2 - filter(RANK() OVER ( PARTITION BY "NAME","ADDR" ORDER BY

INTERNAL_FUNCTION("INSERTDATA") DESC )<=1)

RECOMMENDATIONS

--------------------------------------------------------------------------------

-------------------------------------------------------------------------------

--帶有綁定變量的情況:

SQL> variable var_1 number;

SQL> variable var_2 number;

SQL> variable var_3 number;

SQL> exec :var_1 := 5;

PL/SQL 過(guò)程已成功完成。

SQL> exec :var_2 := 4;

PL/SQL 過(guò)程已成功完成。

SQL> exec :var_3 := 3;

PL/SQL 過(guò)程已成功完成。

SQL> select id,name,addr from t where id<>:var_1 and id<:var_2 and id>

ID NAME? ?? ?? ?? ?? ???ADDR

---------- -------------------- --------------------

1 張? ?? ?? ?? ?? ?? ? 北京

2 張? ?? ?? ?? ?? ?? ? 北京

SQL> SELECT task_name, status FROM dba_advisor_log WHERE owner = 'TEST';

TASK_NAME? ?? ?? ?? ?? ?? ?? ? STATUS

------------------------------ -----------

ADDM:1184202927_1_201? ?? ?? ? COMPLETED

ADDM:1184202927_1_202? ?? ?? ? COMPLETED

test_tuning_task? ?? ?? ?? ?? ?COMPLETED

SQL> BEGIN

2? ???DBMS_SQLTUNE.drop_tuning_task (task_name => 'test_tuning_task');

3??END;

4??/

PL/SQL 過(guò)程已成功完成。

SQL>

SQL>

SQL> DECLARE

2? ? l_sql? ?? ?? ?? ?? ?VARCHAR2(500);

3? ? l_sql_tune_task_id??VARCHAR2(100);

4??BEGIN

5? ? l_sql := 'select id,name,addr from t where id<>:var_1 and id<:var_2 and i>

d<:var_3>

6

7? ? l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task (

8? ?? ?? ?? ?? ?? ?? ?? ?? ? sql_text? ? => l_sql,

9? ?? ?? ?? ?? ?? ?? ?? ?? ? bind_list? ?=> sql_binds(anydata.ConvertNumber(5),

anydata.ConvertNumber(4),anydata.ConvertNumber(3)),

10? ?? ?? ?? ?? ?? ?? ?? ?? ? user_name? ?=> 'TEST',

11? ?? ?? ?? ?? ?? ?? ?? ?? ? scope? ?? ? => DBMS_SQLTUNE.scope_comprehensive,

12? ?? ?? ?? ?? ?? ?? ?? ?? ? time_limit??=> 60,

13? ?? ?? ?? ?? ?? ?? ?? ?? ? task_name? ?=> 'test_tuning_task',

14? ?? ?? ?? ?? ?? ?? ?? ?? ? description => 'Tuning task for an a simple query

.');

15? ? DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id);

16??END;

17??/

PL/SQL 過(guò)程已成功完成。

SQL> SELECT * FROM DBA_SQLTUNE_BINDS;

TASK_ID??OBJECT_ID? ?POSITION VALUE()

---------- ---------- ---------- --------------------

393? ?? ?? ? 1? ?? ?? ? 1 ANYDATA()

393? ?? ?? ? 1? ?? ?? ? 2 ANYDATA()

393? ?? ?? ? 1? ?? ?? ? 3 ANYDATA()

SQL> EXEC DBMS_SQLTUNE.execute_tuning_task(task_name => 'test_tuning_task');

PL/SQL 過(guò)程已成功完成。

SQL> SELECT DBMS_SQLTUNE.report_tuning_task('test_tuning_task') AS recommendatio

ns FROM dual;

RECOMMENDATIONS

--------------------------------------------------------------------------------

GENERAL INFORMATION SECTION

-------------------------------------------------------------------------------

Tuning Task Name? ?? ?? ?? ?? ?? ?: test_tuning_task

Tuning Task Owner? ?? ?? ?? ?? ???: TEST

Scope? ?? ?? ?? ?? ?? ?? ?? ?? ???: COMPREHENSIVE

Time Limit(seconds)? ?? ?? ?? ?? ?: 60

Completion Status? ?? ?? ?? ?? ???: COMPLETED

Started at? ?? ?? ?? ?? ?? ?? ?? ?: 07/10/2008 02:04:29

Completed at? ?? ?? ?? ?? ?? ?? ? : 07/10/2008 02:04:29

Number of Statistic Findings? ?? ?: 1

RECOMMENDATIONS

--------------------------------------------------------------------------------

-------------------------------------------------------------------------------

Schema Name: TEST

SQL ID? ???: 15c91q9b2sxvk? ?--該處的sql_id顯示不正確,可能是oracle的一個(gè) bug

SQL Text? ?: select id,name,addr from t where id<>:var_1 and id<:var_2 and>

id<:var_3>

-------------------------------------------------------------------------------

FINDINGS SECTION (1 finding)

-------------------------------------------------------------------------------

1- Statistics Finding

RECOMMENDATIONS

--------------------------------------------------------------------------------

---------------------

尚未分析表 "TEST"."

Recommendation

--------------

- 考慮收集此表的優(yōu)

execute dbms_stats.gather_table_stats(ownname => 'TEST', tabname => 'T',

estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt =>

'FOR ALL COLUMNS SIZE AUTO');

Rationale

RECOMMENDATIONS

--------------------------------------------------------------------------------

---------

為了選擇好的執(zhí)行計(jì)劃, 優(yōu)化程序需

-------------------------------------------------------------------------------

EXPLAIN PLANS SECTION

-------------------------------------------------------------------------------

1- Original

-----------

Plan hash value: 1601196873

RECOMMENDATIONS

--------------------------------------------------------------------------------

--------------------------------------------------------------------------

| Id??| Operation? ?? ?? ?| Name | Rows??| Bytes | Cost (%CPU)| Time? ???|

--------------------------------------------------------------------------

|? ?0 | SELECT STATEMENT??|? ?? ?|? ???8 |? ?296 |? ???3? ?(0)| 00:00:01 |

|*??1 |??TABLE ACCESS FULL| T? ? |? ???8 |? ?296 |? ???3? ?(0)| 00:00:01 |

--------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - filter("ID"<>:VAR_1 AND "ID"<:var_2 and>

RECOMMENDATIONS

--------------------------------------------------------------------------------

-------------------------------------------------------------------------------

三、SQL Profile:

由于缺少各種信息,優(yōu)化器有時(shí)候會(huì)產(chǎn)生不正確的執(zhí)行計(jì)劃,通常我們可以指定hints來(lái)干預(yù)執(zhí)行計(jì)劃。

SQL AUTO TUNING通過(guò)SQL Profiling來(lái)解決類(lèi)似的問(wèn)題。自動(dòng)調(diào)整優(yōu)化器會(huì)創(chuàng)建SQL Profile,SQL Profile包含SQL語(yǔ)句的輔助統(tǒng)計(jì)信息。

普通優(yōu)化模式下,優(yōu)化器通過(guò)估算出一個(gè)集式、選擇性、cost來(lái)最后決定使用什么樣的執(zhí)行計(jì)劃。SQL Profile利用存儲(chǔ)的額外的信息,

通過(guò)采樣或者部分執(zhí)行的方式來(lái)驗(yàn)證一個(gè)執(zhí)行計(jì)劃是否為最優(yōu)化,保存歷史運(yùn)行統(tǒng)計(jì)信息。

如果一個(gè)tuning task accept SQL Profile,SQL Profile將被永久存儲(chǔ)在數(shù)據(jù)字典中。普通優(yōu)化模式下,優(yōu)化器在產(chǎn)生執(zhí)行計(jì)劃的時(shí)候

將利用數(shù)據(jù)庫(kù)的統(tǒng)計(jì)信息結(jié)合SQL Profile的信息一起分析,最終產(chǎn)生最優(yōu)化的執(zhí)行計(jì)劃。

可以利用CATAGORY控制SQL Profile的使用權(quán)限,數(shù)據(jù)庫(kù)參數(shù)sqltune_category為默認(rèn)DEFAULT。

SQL> SHOW PARAMETER SQLTUNE

NAME? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?TYPE? ?? ???VALUE

------------------------------------ ----------- ------------------------------

sqltune_category? ?? ?? ?? ?? ?? ?? ?string? ?? ?DEFAULT

我們也可以修改數(shù)據(jù)庫(kù)參數(shù)文件,指定我們自己的SQLTUNE_CATEGORY:

ALTER SYSTEM SET SQLTUNE_CATEGORY = PROD;

SQL Profiles apply to the following statement types:

SELECT statements

UPDATE statements

INSERT statements (only with a SELECT clause)

DELETE statements

CREATE TABLE statements (only with the AS SELECT clause)

MERGE statements (the update or insert operations)

SQL Profile基本操作:

SQL> conn /as sysdba

已連接。

SQL> GRANT CREATE ANY SQL_PROFILE TO TEST;

授權(quán)成功。

SQL> GRANT DROP ANY SQL PROFILE TO TEST;

授權(quán)成功。

SQL> GRANT ALTER ANY SQL PROFILE TO TEST;

授權(quán)成功。

SQL> CONN TEST/TEST

已連接。

SET SERVEROUTPUT ON

DECLARE

l_sql_tune_task_id??VARCHAR2(20);

BEGIN

l_sql_tune_task_id := DBMS_SQLTUNE.accept_sql_profile (

task_name => 'test_tuning_task',

name? ?? ?=> 'test_profile');

DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id);

END;

/

BEGIN

DBMS_SQLTUNE.alter_sql_profile (

name? ?? ?? ?? ?=> 'test_profile',

attribute_name??=> 'STATUS',

value? ?? ?? ???=> 'DISABLED');

END;

/

BEGIN

DBMS_SQLTUNE.drop_sql_profile (

name? ?=> 'test_profile',

ignore => TRUE);

END;

/

--example:

SQL> execute dbms_sqltune.accept_sql_profile(task_name => 'test_tuning_task',object_id => 6, replace => TRUE);

SQL> select count(1) from DBA_SQL_PROFILES;

COUNT(1)

----------

1

PL/SQL 過(guò)程已成功完成。

四、幾個(gè)有用的automatic SQL tuning相關(guān)的數(shù)據(jù)字典:

DBA_ADVISOR_TASKS

DBA_ADVISOR_FINDINGS

DBA_ADVISOR_RECOMMENDATIONS

DBA_ADVISOR_RATIONALE

DBA_SQLTUNE_STATISTICS

DBA_SQLTUNE_BINDS

DBA_SQLTUNE_PLANS

DBA_SQLSET

DBA_SQLSET_BINDS

DBA_SQLSET_STATEMENTS

DBA_SQLSET_REFERENCES

DBA_SQL_PROFILES

V$SQL

V$SQLAREA

V$ACTIVE_SESSION_HISTORY

五、DBMS_SQLTUNE包的詳細(xì)方法可以參考:

http://download-west.oracle.com/ ... b10802/d_sqltun.htm

總結(jié)

以上是生活随笔為你收集整理的Oracle adviser,Oracle10g SQL tune adviser的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。