SQL Profiles與語句最佳化
個人理解SQL Profiles可以看作是SQL語句的統計資訊。只是這個統計資訊對特定SQL語句才能起作用,不對會語句的物件、其它語句產生影響。
使用SQL Profiles前要用SQL Tuning Advisor收集對語句的最佳化建議,再根據最佳化建議建立SQL Profiles。
SQL Profiles 使用也比較靈活,可以在會話級、系統級應用。
語句繫結SQL Profile後,測試了下SQL Profile與Bind Peeking的關係。測試發現,Bind Peeking的特性還是會起作用。這從另一方面說明SQL Profile與OUTLINE的不同:繫結OUTLINE後,執行計劃是被固化的;繫結SQL Profile後,執行計劃不是不變,而是最佳化器在執行該語句時,會參考SQL Profile中的資訊。
SQL Profiles會收集哪些資訊?這點比較懸,沒找到特別好的解釋,不過從DBA_SQLTUNE_STATISTICS檢視中也可以看到蛛絲馬跡:
CREATE OR REPLACE VIEW DBA_SQLTUNE_STATISTICS AS SELECT TASK_ID, OBJECT_ID, PARSING_SCHEMA_ID, MODULE, ACTION, ELAPSED_TIME, CPU_TIME, BUFFER_GETS, DISK_READS, DIRECT_WRITES, ROWS_PROCESSED, FETCHES, EXECUTIONS, END_OF_FETCH_COUNT, OPTIMIZER_COST, OPTIMIZER_ENV, COMMAND_TYPE FROM wri$_adv_sqlt_statistics; |
以下是SQL Profiles的使用步驟,記錄一下,當做速查手冊:
1、建立最佳化任務:
–使用SQL TEXT
DECLARE my_task_name VARCHAR2(50); my_sqltext CLOB; BEGIN my_sqltext := 'select /*+ FULL(T) */ * from t where n=:A'; my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK( sql_text => my_sqltext, user_name => 'ROCKEY', scope => 'COMPREHENSIVE', time_limit => 60, task_name => 'rockey_sql_tuning_task_001', description => 'Task to tune a query on a sspecified table'); END; / |
–使用SQL ID:
DECLARE my_task_name VARCHAR2(50); my_sql_id VARCHAR2(64); BEGIN my_sql_id := 'gh991ctttx3k7'; my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK( sql_id => my_sql_id, scope => 'COMPREHENSIVE', time_limit => 60, task_name => 'rockey_sql_tuning_task_001', description => 'Task to tune a query on a specified table'); END; / |
2、執行最佳化任務:
BEGIN DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'rockey_sql_tuning_task_001'); end; / |
3、檢視最佳化建議:
SET WRAP ON SET LONG 10000 SET LONGCHUNKSIZE 1000 SET LINESIZE 130 SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 'rockey_sql_tuning_task_001') from DUAL; 或者 SELECT dbms_advisor.GET_TASK_REPORT(task_name) FROM dba_advisor_tasks where task_name = 'rockey_sql_tuning_task_001'; |
其中dbms_advisor.GET_TASK_REPORT可用於檢視ADDM REPORT。
4、SQL語句綁字SQL Profile:
begin dbms_sqltune.accept_sql_profile(task_name => 'rockey_sql_tuning_task_001', name => 'my_sql_profile_001', replace => TRUE, force_match => true); end; / |
5、檢視語句是否使用了SQL Profile:
select sql_text, sql_id, sql_profile, executions, plan_hash_value from v$sql where sql_profile is not null; |
6、其它常用功能:
刪除最佳化任務:
begin dbms_sqltune.drop_tuning_task('rockey_sql_tuning_task_001'); end; /
begin dbms_advisor.delete_task('rockey_sql_tuning_task_001'); end; / |
刪除SQL Profile:
BEGIN DBMS_SQLTUNE.DROP_SQL_PROFILE(name => 'my_sql_profile_001'); END; / |
與最佳化任務相關的常用檢視:
select * from dba_sql_profiles;
select * from DBA_ADVISOR_TASKS; |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9907339/viewspace-1050973/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 最佳化sql語句SQL
- SQL語句最佳化SQL
- sql最佳化:使用sql profile最佳化sql語句SQL
- sql語句的最佳化SQL
- SQL語句運算子最佳化SQL
- 效能最佳化之SQL語句最佳化SQL
- SQL語句最佳化技術分析SQL
- ORACLE常用SQL最佳化hint語句OracleSQL
- 資料庫最佳化技巧 - SQL語句最佳化資料庫SQL
- PL/SQL與DDL語句SQL
- 對sql語句的最佳化問題SQL
- Oracle SQL語句最佳化技術分析OracleSQL
- straight_join最佳化sql語句AISQL
- Oracle sql with 語句語法與例子OracleSQL
- MySQL 5.5 SHOW PROFILE、SHOW PROFILES語句介紹MySql
- MySQL的SQL語句最佳化一例MySql
- Effective MySQL之SQL語句最佳化 小結MySql
- MySql與Sql Server Update語句MySqlServer
- SQL最佳化案例-單表分頁語句的最佳化(八)SQL
- SQL語句與正規表示式SQL
- SQL語句SQL
- Java中如何解析SQL語句、格式化SQL語句、生成SQL語句?JavaSQL
- MySQL Order by 語句用法與最佳化詳解MySql
- spark sql語句效能最佳化及執行計劃SparkSQL
- 查詢阻塞與被阻塞SQL語句SQL
- sql語句大全SQL
- 共享SQL語句SQL
- SQL語句整理SQL
- SQL基本語句SQL
- 精妙Sql語句SQL
- SQL語句集合SQL
- oracle sql語句OracleSQL
- sql語句 求救!SQL
- SQL精妙語句SQL
- SQL語句收集SQL
- 常用SQL語句SQL
- sql常用語句SQL
- flask之控制語句 if 語句與for語句Flask