SQL Tuning Advisor(SQL调优顾问,STA)

SQL调优顾问需要一个或多个SQL语句作为输入,并调用自动优化器执行SQL调优。SQL调优顾问输出是以一种意见或者建议的形式,以及对每一项建议和期望效益的理由。该建议涉及对象的统计收集新索引的创建SQL语句的重组,或SQL概要的创建。你可以选择该建议来完成SQL语句的调优。

Oracle数据库可以自动优化有问题的SQL语句,并使用SQL调优顾问实现调优建议。也可以手动运行SQL调优顾问选择单个SQL语句或者一个SQL语句集来完成SQL语句调优。

一般使用的比较多的是手动SQL调优顾问,因此也重点介绍手动SQL调优顾问。

 

1.自动SQL调优顾问

1.1启用自动SQL调优

begin
  dbms_auto_task_admin.enable(client_name => 'sql tuning advisor',
                              operation   => null,
                              window_name => null);
end;

1.2失效自动SQL调优

begin
  dbms_auto_task_admin.disable(client_name => 'sql tuning advisor',
                               operation   => null,
                               window_name => null);
end;

 

1.3查看自动SQL调优报表

create  table a (a1 clob);

declare
  my_rept clob;
begin
  my_rept := dbms_sqltune.report_auto_tuning_task(begin_exec   => null,
                                                  end_exec     => null,
                                                  type         => 'TEXT',
                                                  level        => 'TYPICAL',
                                                  section      => 'ALL',
                                                  object_id    => null,
                                                  result_limit => null);

  insert into a values (my_rept);
end;

select * from a;

 

截取报告片段:

FINDINGS SECTION (3 findings)
-------------------------------------------------------------------------------

1- Statistics Finding
---------------------
  表 "SYS"."OBJAUTH$" 及其索引的优化程序统计信息已失效。

  Recommendation
  --------------
  - 考虑收集此表的优化程序统计信息。
    execute dbms_stats.gather_table_stats(ownname => 'SYS', tabname =>
            'OBJAUTH$', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
            method_opt => 'FOR ALL COLUMNS SIZE AUTO');

  Rationale
  ---------
    为了选择好的执行计划, 优化程序需要此表的最新统计信息。

 

2.手动SQL调优顾问

SQL调优顾问可以按照需求手动调用一个或者多个SQL语句。要调用多条SQL语句,需要创建一个SQL调优集(STS)。SQL调优集是一个存储SQL语句以及执行上下文的数据库对象。

使用DBMS_SQLTUNE包运行SQL调优顾问,需要一下几个步骤:

  1. 创建SQL调优集(如果调优多个SQL语句)
  2. 创建SQL调优任务
  3. 执行优化SQL调优任务
  4. 显示SQL调优任务结果
  5. 实现适当的建议

一个SQL调优任务可以为单个SQL语句创建。对于多个SQL语句,需要先创建SQL调优集(STS)。具体步骤如下:

 

为了找出有问题的SQL语句,需要创建创建一张没有任何所有的表。如下:

create table my_objects as select * from dba_objects;

查询EMP对象的SQL语句

select * from my_objects o where o.object_name='EMP';

my_objects表上没有任何创建索引,因此该查询语句肯定是有问题的,接下来使用SQL调优顾问来优化该SQL语句:

 

2.1.创建SQL调优任务

declare
  v_my_task_name varchar2(50);
  v_my_sql_text  clob;
begin
  v_my_sql_text := 'select * from my_objects o where o.object_name=:bin';

  v_my_task_name := dbms_sqltune.create_tuning_task(sql_text    => v_my_sql_text,
                                                    bind_list   => sql_binds(anydata.convertvarchar2('EMP')),
                                                    user_name   => 'GDSHEC',
                                                    scope       => 'COMPREHENSIVE',
                                                    time_limit  => 60,
                                                    task_name   => 'my_sql_tuning_task',
                                                    description => 'Task to tune a query on a specified  ');

end;

 

2.2.配置SQL调优任务

begin
  dbms_sqltune.set_tuning_task_parameter(task_name => 'my_sql_tuning_task',
                                         parameter => 'TIME_LIMIT',
                                         value     => 300);
end;

 

2.3.执行SQL调优任务

begin
  dbms_sqltune.execute_tuning_task(task_name => 'my_sql_tuning_task');
end;

 

2.4.检查SQL调优任务状态

select * from dba_advisor_tasks t where t.task_name = 'my_sql_tuning_task';

2.5.显示SQL调优任务结果

select dbms_sqltune.report_tuning_task(task_name => 'my_sql_tuning_task')
  from dual;

 

优化结果报告:

GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name   : my_sql_tuning_task
Tuning Task Owner  : GDSHEC
Workload Type      : Single SQL Statement
Scope              : COMPREHENSIVE
Time Limit(seconds): 300
Completion Status  : COMPLETED
Started at         : 12/05/2013 16:10:32
Completed at       : 12/05/2013 16:10:34

-------------------------------------------------------------------------------
Schema Name: GDSHEC
SQL ID     : 14suc19101mgf
SQL Text   : select * from my_objects o where o.object_name=:bin

-------------------------------------------------------------------------------
FINDINGS SECTION (1 finding)
-------------------------------------------------------------------------------

1- Index Finding (see explain plans section below)
--------------------------------------------------
  通过创建一个或多个索引可以改进此语句的执行计划。

  Recommendation (estimated benefit: 98.73%)
  ------------------------------------------
  - 考虑运行可以改进物理方案设计的访问指导或者创建推荐的索引。
    create index GDSHEC.IDX$$_02290001 on GDSHEC.MY_OBJECTS("OBJECT_NAME");

  Rationale
  ---------
    创建推荐的索引可以显著地改进此语句的执行计划。但是, 使用典型的 SQL 工作量运行 "访问指导"
    可能比单个语句更可取。通过这种方法可以获得全面的索引建议案, 包括计算索引维护的开销和附加的空间消耗。

-------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------

1- Original
-----------
Plan hash value: 880823944

--------------------------------------------------------------------------------
| Id  | Operation         | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |            |     2 |   194 |   317   (1)| 00:00:04 |
|*  1 |  TABLE ACCESS FULL| MY_OBJECTS |     2 |   194 |   317   (1)| 00:00:04 |
--------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter("O"."OBJECT_NAME"=:BIN)

2- Using New Indices
--------------------
Plan hash value: 394593291

----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                |     2 |   194 |     4   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| MY_OBJECTS     |     2 |   194 |     4   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX$$_02290001 |     2 |       |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - access("O"."OBJECT_NAME"=:BIN)

-------------------------------------------------------------------------------

 

总结:SQL调优顾问发现一个问题,建议在OBJECT_NAME表的MY_OBJECTS字段上创建索引。并对照创建索引前后的执行计划进行对比。

 

2.6删除SQL调优任务

begin
  dbms_sqltune.drop_tuning_task(task_name => 'my_sql_tuning_task');
end;

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server 性能调优是一个综合性的工作,可以从多个方面进行优化。以下是一些常见的 SQL Server 性能调优方法: 1. 硬件优化:确保服务器硬件配置足够强大,例如 CPU、内存、磁盘等。可以考虑升级硬件或者使用更高性能的硬件设备。 2. 索引优化:通过创建合适的索引来加速查询操作。分析查询语句的执行计划,确定是否需要创建、删除或修改索引。使用 SQL Server 提供的索引优化工具,如 Database Engine Tuning Advisor。 3. 查询优化:编写高效的查询语句,避免全表扫描、避免不必要的连接和子查询。使用合适的查询提示或者强制查询计划。 4. 统计信息维护:定期更新统计信息,以便 SQL Server 生成更准确的查询执行计划。可以使用自动创建和更新统计信息的功能。 5. 存储过程和函数优化:优化存储过程和函数的执行逻辑,减少不必要的运算和数据访问。可以考虑使用内联函数或者编译存储过程。 6. 分区表设计:对于大型表,可以考虑使用分区表来提高查询性能。将表分割成多个分区,可以减少数据扫描的范围。 7. 内存优化:合理配置 SQL Server 的内存,确保足够的内存用于缓存数据和执行计划。可以使用 max server memory 参数来控制 SQL Server 可以使用的最大内存量。 8. 日志和事务管理:合理设置事务日志的大小和自动增长选项。避免长时间运行的事务或者多次开启和提交事务。 9. 并发控制:合理设置并发连接数、最大并行度等参数,以适应系统的负载。避免过多的并发连接和并行查询导致性能下降。 10. 定期维护:定期进行数据库备份、日志清理、索引重建、碎片整理等维护操作,以保持数据库的健康状态。 以上是一些常见的 SQL Server 性能调优方法,具体的调优策略需要根据实际情况进行评估和实施。在进行调优之前,建议先备份数据库,并在测试环境中进行验证和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值