Oracle智能之SQL診斷:SQL Tuning Advisor推薦執行計劃
編輯手記:在前一段,一篇智能數據庫優化的論文引起廣泛的關注,其實在 Oracle 數據庫中,已經引入了大量自動化和智能化的方法去進行自動調節,包括在 SQL 層麵的智能診斷分析和建議。
張大朋(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的方式沒有使用索引,而是全表掃描,這是我們預期的結果:
下麵我們運行SQL Tuning Advisor來生成建議報告:
查看生成的報告內容:
這裏我們看到SQL Tuning Advisor提示了兩個建議:
method_opt => 'FOR ALL COLUMNS SIZE AUTO' ); 2,提供了一個執行計劃建議:
execute dbms_sqltune.accept_sql_profile(task_name =>
|
並且給出了這個執行計劃和原始執行計劃的對比,可以看到 執行效率提高了89%以上,邏輯讀從23降低為2,減少了91.3%。
我們按照建議執行以上的兩條命令。首先收集統計信息,再接受建議的執行計劃,現在看看 SQL 執行的情況:
這裏我們看到,這個執行計劃中已經使用了索引,並且邏輯讀從49降低為14。
現在我們查看一下這個SQL Profile的OUTLINE:
這裏我們看到該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