使用SQL PROFILE 給出合理的執行計劃
DBA可以使用SQL調整顧問(STA)或SQL訪問顧問(SAA)來識別可以得到更好效能的SQL語句,
這些語句可以儲存在SQL調整集、一個AWR快照或儲存在當前的庫快取中,一旦識別出調整候
選者, 這些顧問程式就開始分析捕獲到的語句以期獲得更好的效能,然後生成專用的語句擴充套件(就叫
做SQL配置檔案)並重寫SQL語句以在執行期間獲取更佳的效能。
與儲存概要類似,一個SQL配置檔案提供了使用更好的執行計劃的能力(如果這個執行計
劃是可用的),SQL配置檔案也可以象儲存概要一樣分階段執行,或限制到對特定會話才能執
行該SQL配置檔案,但是大多數重要的改進超過了儲存概要,
至少有兩方面:
(a)自我調整的能力保障了SQL配置檔案能提供最好的執行計劃
(b)檢查SQL配置檔案不再有效的能力(因此ADDM建議需要生成一個新的SQL配置檔案)
SQL Profile對於一下型別語句有效:
SELECT語句;
UPDATE語句;
INSERT語句(僅當使用SELECT子句時有效);
DELETE語句;
CREATE語句(僅當使用SELECT子句時有效);
MERGE語句(僅當作UPDATE和INSERT操作時有效)。
另外,使用SQL Profile還必須有CREATE ANY SQL PROFILE、DROP ANY SQL PROFILE和ALTER ANY SQL PROFILE等系統許可權。
SQL PROFILE 實驗:
1.建立測試表
SQL> drop table t purge;
Table dropped.
SQL> create table t as select object_id,object_name from dba_objects;
Table created.
SQL> insert into t select * from t;
14140 rows created.
SQL> /
28280 rows created.
SQL> /
56560 rows created.
SQL> /
113120 rows created.
SQL> update t set object_name='T';
226240 rows updated.
SQL> UPDATE T SET OBJECT_NAME='T1' WHERE ROWNUM=1;
1 row updated.
SQL> COMMIT;
Commit complete.
SQL>declare
my_task_name varchar2(30);
mysqltext clob;
begin
mysqltext := 'select * from t where object_NAME=''T1''';
my_task_name := dbms_sqltune.create_tuning_task(sql_text => mysqltext,
user_name => 'SCOTT',
scope => 'COMPREHENSIVE',
task_name => 'sql_tuning_test');
end;
/
PL/SQL procedure successfully completed.
SQL> exec dbms_sqltune.execute_tuning_task('sql_tuning_test');
PL/SQL procedure successfully completed.
SQL> SET LONG 999999
SQL> SET LINESIZE 1000
SQL> set serveroutput on size 999999
SQL> select dbms_sqltune.report_tuning_task('sql_tuning_test') from dual;
GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name : sql_tuning_test
Tuning Task Owner : SCOTT
Workload Type : Single SQL Statement
Scope : COMPREHENSIVE
Time Limit(seconds): 1800
Completion Status : COMPLETED
Started at : 08/25/2015 15:09:49
Completed at : 08/25/2015 15:09:50
-------------------------------------------------------------------------------
Schema Name: SCOTT
SQL ID : 2qkpfwtzpdc0d
SQL Text : select * from t where object_NAME='T1'
-------------------------------------------------------------------------------
FINDINGS SECTION (2 findings)
-------------------------------------------------------------------------------
1- Statistics Finding
---------------------
尚未分析表 "SCOTT"."T"。
Recommendation
--------------
- 考慮收集此表的最佳化程式統計資訊。
execute dbms_stats.gather_table_stats(ownname => 'SCOTT', tabname => 'T',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt =>
'FOR ALL COLUMNS SIZE AUTO');
Rationale
---------
為了選擇好的執行計劃, 最佳化程式需要此表的最新統計資訊。
2- Index Finding (see explain plans section below)
--------------------------------------------------
透過建立一個或多個索引可以改進此語句的執行計劃。
Recommendation (estimated benefit: 99.1%)
-----------------------------------------
- 考慮執行可以改進物理方案設計的訪問指導或者建立推薦的索引。
create index SCOTT.IDX$$_07230001 on SCOTT.T("OBJECT_NAME","OBJECT_ID");
Rationale
---------
建立推薦的索引可以顯著地改進此語句的執行計劃。但是, 使用典型的 SQL 工作量執行 "訪問指導"
可能比單個語句更可取。透過這種方法可以獲得全面的索引建議案, 包括計算索引維護的開銷和附加的空間消耗。
-------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------
1- Original
-----------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 11 | 869 | 224 (1)| 00:00:03 |
|* 1 | TABLE ACCESS FULL| T | 11 | 869 | 224 (1)| 00:00:03 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OBJECT_NAME"='T1')
2- Using New Indices
--------------------
Plan hash value: 3722711773
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 79 | 2 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| IDX$$_07230001 | 1 | 79 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("OBJECT_NAME"='T1')
-------------------------------------------------------------------------------
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12798004/viewspace-1782223/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle SQL Profile固定執行計劃的方法OracleSQL
- .Oracle固定執行計劃之SQL PROFILE概要檔案OracleSQL
- Oracle利用coe_load_sql_profile指令碼繫結執行計劃OracleSQL指令碼
- Oracle優化案例-coe_xfr_sql_profile固定執行計劃與刪除profile(二十五)Oracle優化SQL
- Oracle sql執行計劃OracleSQL
- Oracle優化案例-view merge與coe_load_sql_profile固定執行計劃(十五)Oracle優化ViewSQL
- 如何檢視SQL的執行計劃SQL
- 在MySQL中使用explain查詢SQL的執行計劃MySqlAI
- MySQL——通過EXPLAIN分析SQL的執行計劃MySqlAI
- 使用sql monitor獲取更加詳細的執行計劃 - dbms_sqltune.report_sql_monitorSQL
- SQL執行計劃異常引起的效能問題SQL
- SQL執行計劃異常 引起的效能問題SQL
- SQLServer統計監控SQL執行計劃突變的方法SQLServer
- 執行計劃-1:獲取執行計劃
- 分析執行計劃優化SQLORACLE的執行計劃(轉)優化SQLOracle
- Oracle資料庫關於SQL的執行計劃(轉)Oracle資料庫SQL
- 檢視SQL執行計劃的幾種常用方法YQSQL
- Oracle檢視sql_id 的歷史執行計劃OracleSQL
- SQL優化案例-從執行計劃定位SQL問題(三)SQL優化
- 檢視一個正在執行的sql的執行計劃(explain for connection processlist_id)SQLAI
- 【執行計劃】Oracle獲取執行計劃的幾種方法Oracle
- SQL最佳化案例-從執行計劃定位SQL問題(三)SQL
- TiDB與MySQL的SQL差異及執行計劃簡析TiDBMySql
- Oracle執行計劃Explain Plan 如何使用OracleAI
- oracle使用outline固定執行計劃事例Oracle
- PostgreSQL 查詢當前執行中sql的執行計劃——pg_show_plans模組SQL
- 達夢資料庫獲取SQL真實的執行計劃資料庫SQL
- 獲取oracle sql語句詳細些執行計劃OracleSQL
- spark sql語句效能最佳化及執行計劃SparkSQL
- 達夢資料庫SQL執行計劃檢視方法資料庫SQL
- 【TUNE_ORACLE】定製化執行計劃SQL參考OracleSQL
- MySQL執行計劃MySql
- SYBASE執行計劃
- MySQL 執行計劃MySql
- Oracle DB 相關常用sql彙總7【手工繫結sql執行計劃】OracleSQL
- 通過鎖定表的統計資訊來穩定sql的執行計劃SQL
- Oracle優化案例-從執行計劃定位SQL問題(三)Oracle優化SQL
- 微課sql最佳化(9)、如何獲取執行計劃SQL
- 微課sql最佳化(11) 、如何檢視執行計劃SQL