閱讀543 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Oracle智能之SQL診斷:SQL Tuning Advisor推薦執行計劃

編輯手記:在前一段,一篇智能數據庫優化的論文引起廣泛的關注,其實在 Oracle 數據庫中,已經引入了大量自動化和智能化的方法去進行自動調節,包括在 SQL 層麵的智能診斷分析和建議。


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

張大朋(Lunar)Oracle 資深技術專家

Lunar 擁有超過十年的 ORACLE SUPPORT 從業經驗,曾經服務於ORACLE ACS部門,現就職於 ORACLE Sales Consultant 部門,負責的產品主要是 Exadata,Golden Gate,Database 等。



本文的測試目的,起因一個問題:當有hint時,並且hint跟需要綁定的執行計劃有衝突,誰的優先級高?


在這個演示過程中,使用SQL Tuning Advisor來進行輔助,在 Oracle 數據庫中,SQL Tuning Advisor 的智能化程度可能超過很多人的想象,應該多學習和使用。


首先創建一個測試用例:

LUNAR@lunardb>create table lunartest1 (n number );

 

Table created.

 

Elapsed: 00:00:00.08

LUNAR@lunardb>begin

  2         for i in 1 .. 10000 loop

  3             insert into lunartest1 values(i);

  4             commit;

  5         end loop;

  6        end;

  7  /

 

PL/SQL procedure successfully completed.

LUNAR@lunardb>create index idx_lunartest1_n on lunartest1(n);

Index created.

 

Elapsed: 00:00:00.04


執行查詢,我們看到sql按照hint的方式沒有使用索引,而是全表掃描,這是我們預期的結果:


640?wx_fmt=png&wxfrom=5&wx_lazy=1


下麵我們運行SQL Tuning Advisor來生成建議報告:


640?wx_fmt=png&wxfrom=5&wx_lazy=1


查看生成的報告內容:


640?wx_fmt=png&wxfrom=5&wx_lazy=1

640?wx_fmt=png&wxfrom=5&wx_lazy=1

640?wx_fmt=png&wxfrom=5&wx_lazy=1


這裏我們看到SQL Tuning Advisor提示了兩個建議:

1.收集統計信息

execute dbms_stats.gather_table_stats(ownname => 'LUNAR',

tabname =>'LUNARTEST1',

estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,

method_opt => 'FOR ALL COLUMNS SIZE AUTO');
2,提供了一個執行計劃建議:
execute dbms_sqltune.accept_sql_profile(task_name =>

'Lunar_tunning_bjgduva68mbqm',

task_owner => 'LUNAR',

replace =>TRUE);


並且給出了這個執行計劃和原始執行計劃的對比,可以看到 執行效率提高了89%以上,邏輯讀從23降低為2,減少了91.3%。

我們按照建議執行以上的兩條命令。首先收集統計信息,再接受建議的執行計劃,現在看看 SQL 執行的情況:


640?wx_fmt=png&wxfrom=5&wx_lazy=1


這裏我們看到,這個執行計劃中已經使用了索引,並且邏輯讀從49降低為14。


現在我們查看一下這個SQL Profile的OUTLINE:


640?wx_fmt=png&wxfrom=5&wx_lazy=1


這裏我們看到該SQP Profile中提供了詳細的表和列的統計信息
並且有“IGNORE_OPTIM_EMBEDDED_HINTS”,也就是忽略嵌入到SQL中的hint 。

結論:雖然這個SQL的hint中指定了no index,即不使用索引,但是SQL語句仍然按照SYS_SQLPROF_015236655fb80000指定的profile使用了index。
 這說明dbms_sqltune.accept_sql_profile方式綁定的執行計劃優先級高於hint指定是否使用索引的方式。


本文出自數據和雲公眾號,原文鏈接



最後更新:2017-07-17 16:44:47

  上一篇:go  警示:一個專為AIX上11.2.0.4版本定製的Bug正在高發
  下一篇:go  全民上雲時代,如何選擇一款好的MongoDB產品