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
- Java中如何解析SQL語句、格式化SQL語句、生成SQL語句?JavaSQL
- SQL語句SQL
- SQL最佳化案例-單表分頁語句的最佳化(八)SQL
- 【SQL】9 SQL INSERT INTO 語句SQL
- 【SQL】10 SQL UPDATE 語句SQL
- 【SQL】11 SQL DELETE 語句SQLdelete
- sql常用語句SQL
- SQL SELECT 語句SQL
- spark sql語句效能最佳化及執行計劃SparkSQL
- [20221012]修改統計資訊最佳化sql語句.txtSQL
- [20240320]空格與sqlpus的sql語句.txtSQL
- MySQL Order by 語句用法與最佳化詳解MySql
- 日期與字串的互相轉換SQL語句字串SQL
- 1.3. SQL 語句SQL
- Oracle基本SQL語句OracleSQL
- Sql語句小整理SQL
- SQL語句優化SQL優化
- SQL 語句學習SQL
- SQL語句IN的用法SQL
- flask之控制語句 if 語句與for語句Flask
- 第45期:一條 SQL 語句最佳化的基本思路SQL
- Oracle SQL精妙SQL語句講解OracleSQL
- SQL語句優化的原則與方法QOSQL優化
- 18 與Oracle Data Guard 相關的SQL語句OracleSQL
- 【SQL】14 UNION 操作符、SELECT INTO 語句、INSERT INTO SELECT 語句、CREATE DATABASE 語句、CREATE TABLE 語句SQLDatabase
- mysql 語句如何最佳化MySql
- 最佳化if...else...語句
- 【MySQL】MySQL語句最佳化MySql
- SQL語言基礎(SELECT語句)SQL
- SQL mother查詢語句SQL
- sql查詢語句流程SQL
- 統計介面sql語句SQL
- 常用sql進階語句SQL
- SQL 常用語句一覽SQL
- SQL查詢語句 (Oracle)SQLOracle
- sql語句效能優化SQL優化
- MYSQL SQL語句優化MySql優化