SQL Profiles与语句优化
链接:http://www.dbaroad.me/archives/2010/03/sql_profiles.html
最近对10G的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 Profile:
DECLARE my_sqlprofile_name VARCHAR2(30); BEGIN my_sqlprofile_name := DBMS_SQLTUNE.ACCEPT_SQL_PROFILE ( task_name => 'rockey_sql_tuning_task_001', name => 'my_sql_profile_001', category => 'my_category'); END; / |
5、SQL语句绑字SQL Profile:
修改sqltune_category参数,可以会话级、系统级进行更改:
alter session set sqltune_category=MY_CATEGORY; |
6、查看语句是否使用了SQL Profile:
select sql_text, sql_id, sql_profile, executions, plan_hash_value from v$sql where sql_profile is not null; |
7、其它常用功能:
删除优化任务:
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; |
— The End —


站内搜索