首页 > 数据库 > Oracle > 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博客 ” ,链接:https://blog.itpub.net/9907339/viewspace-1050973/ ,如需转载,请注明出处,否则将追究法律责任。