ITPub博客

首页 > 数据库 > Oracle > SQL Profiles与语句优化

SQL Profiles与语句优化

原创 Oracle 作者:maojinyu 时间:2011-06-09 15:09:18 0 删除 编辑

个人理解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;

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9907339/viewspace-1050973/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: rename datafile
请登录后发表评论 登录
全部评论

注册时间:2012-05-09

  • 博文量
    178
  • 访问量
    376684