控制執行計劃之-SQL Profile(一)
SQL Profile與dataguard
SQL Profile還有一個極大的好處就是它可以在主庫上建立後在備庫上使用,試想如果你有一套ACTIVE DATAGUARD對外提供查詢服務,遭遇到了執行計劃錯誤的問題,而這些SQL固化技術都不能在GATAGUARD上使用,那心情會有多麼糟糕。SPM baseline不能用於DATAGUARD,但是SQL profile是支援的。如果想讓SQL Profile在備庫生效,我們首先需要在主庫上建立一個SQL Profile,然後在備庫執行同樣SQL文字的SQL時,就會使用到建立的SQL PRIFILE,我們來看看實驗:
建立一個測試表test,在列object_id上建立索引,建立完成後分析表。 >select DATABASE_ROLE from v$database;
DATABASE_ROLE -------------------------------- PRIMARY
create table test as select * from dba_objects; create index t on test(object_id); begin dbms_stats.gather_table_stats(ownname =>'monitor', tabname => 'TEST', no_invalidate => FALSE, estimate_percent => 100, force => true, degree => 5, method_opt => 'for all columns size 1', cascade => true); end; / 檢視SQL_ID,根據SQL_ID獲取語句的執行計劃。 >select sql_id,sql_text from v$sql where sql_text like '%test w%';
SQL_ID SQL_TEXT ------------------- ------------------------------------------------------------------- f16x80gfqm2fv select sql_id,sql_text from v$sql where sql_text like '%test w%' >@plan Enter value for hash_value: btuhzhv88wwv3
PLAN_TABLE_OUTPUT --------------------------------------------------------------------------------------- SQL_ID btuhzhv88wwv3, child number 0 ------------------------------------- select * from test where object_id=1
Plan hash value: 1353936115
------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | | 2 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID| TEST | 1 | 91 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | T | 1 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------
Predicate Information (identified by operation id): ---------------------------------------------------
2 - access("OBJECT_ID"=1) 執行計劃選擇走了索引掃描,如果我們想用SQL Profile來穩固執行計劃: >@profile Enter value for sql_id: btuhzhv88wwv3 PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------ SQL_ID btuhzhv88wwv3, child number 0 ------------------------------------- select * from test where object_id=1
Plan hash value: 1353936115
------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | | 2 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID| TEST | 1 | 91 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | T | 1 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------
Outline Data -------------
/*+ BEGIN_OUTLINE_DATA IGNORE_OPTIM_EMBEDDED_hintS OPTIMIZER_FEATURES_ENABLE('11.2.0.3') DB_VERSION('11.2.0.3') OPT_PARAM('_optim_peek_user_binds' 'false') OPT_PARAM('_optimizer_skip_scan_enabled' 'false') ALL_ROWS OUTLINE_LEAF(@"SEL$1") INDEX_RS_ASC(@"SEL$1" "TEST"@"SEL$1" ("TEST"."OBJECT_ID")) END_OUTLINE_DATA */
Predicate Information (identified by operation id): ---------------------------------------------------
2 - access("OBJECT_ID"=1)
35 rows selected.
Enter value for hint_text: INDEX_RS_ASC(@"SEL$1" "TEST"@"SEL$1" ("TEST"."OBJECT_ID")) Profile profile_btuhzhv88wwv3_dwrose created.
登入備庫,看看同樣的查詢是否已經可以使用到新建立的SQL Profile了: >conn monitor/monitor Connected. >select DATABASE_ROLE from v$database;
DATABASE_ROLE -------------------------------- PHYSICAL STANDBY
>select * from test where object_id=1;
no rows selected
>@plan Enter value for hash_value: btuhzhv88wwv3
PLAN_TABLE_OUTPUT --------------------------------------------------------------------------------------- SQL_ID btuhzhv88wwv3, child number 0 ------------------------------------- select * from test where object_id=1
Plan hash value: 1353936115
------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | | 2 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID| TEST | 1 | 91 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | T | 1 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------
Predicate Information (identified by operation id): ---------------------------------------------------
2 - access("OBJECT_ID"=1) Note ----- - SQL profile profile_btuhzhv88wwv3_dwrose used for this statement 我們看到SQL Profile已經使用到了。 |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1349486/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- .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執行計劃MySqlAI
- 獲取執行計劃之Autotrace
- 檢視一個正在執行的sql的執行計劃(explain for connection processlist_id)SQLAI
- 執行計劃-1:獲取執行計劃
- Mysql SQL最佳化系列之——執行計劃連線方式淺釋MySql
- MySQL——通過EXPLAIN分析SQL的執行計劃MySqlAI
- SQL優化案例-從執行計劃定位SQL問題(三)SQL優化
- mysql調優之——執行計劃explainMySqlAI
- MongoDb學習之Explain執行計劃MongoDBAI
- SQL最佳化案例-從執行計劃定位SQL問題(三)SQL
- SQL執行計劃異常引起的效能問題SQL
- SQL執行計劃異常 引起的效能問題SQL
- SQLServer統計監控SQL執行計劃突變的方法SQLServer
- Oracle調優之看懂Oracle執行計劃Oracle
- 分析執行計劃優化SQLORACLE的執行計劃(轉)優化SQLOracle
- 執行緒控制之休眠執行緒執行緒
- 獲取oracle sql語句詳細些執行計劃OracleSQL
- Oracle資料庫關於SQL的執行計劃(轉)Oracle資料庫SQL
- spark sql語句效能最佳化及執行計劃SparkSQL
- 檢視SQL執行計劃的幾種常用方法YQSQL
- 達夢資料庫SQL執行計劃檢視方法資料庫SQL
- 【TUNE_ORACLE】定製化執行計劃SQL參考OracleSQL
- 在MySQL中使用explain查詢SQL的執行計劃MySqlAI
- Oracle檢視sql_id 的歷史執行計劃OracleSQL
- MySQL執行計劃MySql
- SYBASE執行計劃
- MySQL 執行計劃MySql
- 一次搞定各種資料庫SQL執行計劃:MySQL、Oracle、SQL Server、PostgreSQL以及SQLite資料庫MySqlOracleServerSQLite
- 【執行計劃】Oracle獲取執行計劃的幾種方法Oracle
- Oracle DB 相關常用sql彙總7【手工繫結sql執行計劃】OracleSQL
- SQL優化案例-改變那些CBO無能為力的執行計劃(一)SQL優化
- Oracle優化案例-從執行計劃定位SQL問題(三)Oracle優化SQL