Performance Tuning
Overview
• 系统调优是一个涉及面很宽泛的主题, 它可以
  分为硬件、软件或者按系统层次分显示层、应
  用层、数据库层等. 这一章介绍的是Oracle数
  据库层的调优, 着重于一些工具的使用和系统
  的配置, 包括:
 – 使用自动内存管理(Automatic Memory
   Management)
 – 使用内存顾问程序(Memory Advisor) 配置自动PGA
   内存管理(Automatic PGA Memory Management)
 – 使用SQL调优顾问程序(SQL Tuning Advisor)
 – 使用SQL访问顾问程序(SQL Access Advisor)
Managing Memory
           - Overview & PGA
• Oracle实例的内存管理分为两个部分: PGA内存管理和SGA内存管理. 从9i开
  始实现了对PGA内存的自动管理, 10g实现了对SGA内存的自动管理, 在11g
  中则更进一步允许将PGA和SGA作为一个整体进行自动管理.
• PGA Memory Management
  – 用户会话由客户端进程和服务端进程组成, 与服务端进程相关联的是PGA内存,
    这是每一个会话私有的. PGA内存用于存储与会话相关的数据, 包括:
     • 临时表数据(temporary tables)
     • 排序临时数据(sorting rows)
     • 合并位图(merging bitmaps)
     • 变量(variables)
     • 调用堆栈(call stack)
    对于会话数据, 有的必须使用PGA内存, 比如调用堆栈; 另外的数据在PGA内存不
    够的情况下会使用磁盘空间作为临时的存储, 比如临时表空间.
  – 在11g版本中PGA内存支持手动管理, 但这只是为了向后兼容. 使用如下两个参
    数启用PGA内存的自动管理:
     • WORKAREA_SIZE_POLICY
     • PGA_AGGREGATE_TARGET
    第一个参数的默认值是AUTO, 表示系统自动为会话分配PGA内存; 第二个参数
    表示所有会话PGA内存总和的目标值.
Managing Memory
               - SGA
• SGA包含以下内存结构, 它们的大小均可以进行独立的设置:
  – 共享池               数据块缓冲区
  – 大池                流池
  – Java池             重做日志缓冲区
  这里不讨论大池、流池和Java池. Oracle官方推荐除日志缓冲区(由启动参
  数log_buffer决定)之外, 对SGA使用自动内存管理, 在这种方式下系统会自
  动调节各个组件占用的内存空间, 以达到最佳的效率.使用SGA自动内存管
  理需要作如下设置:
  – 设置SGA_TARGET参数, 该参数表示SGA总体内存的目标值;
  将下面所有用户SGA手动管理的参数设置为0:
  – SHARED_POOL_SIZE
  – DB_CACHE_SIZE
  – LARGE_POOL_SIZE
  – STREAMS_POOL_SIZE
  – JAVA_POOL_SIZE
  在设置了SGA_TARGET参数的情况下, 如果对上述的任意参数设置了大于0的数值,
  那么该设置将作为该SGA组件分配内存的最小值, SGA仍使用自动管理.
Automatic Memory Management
             - AMM
• 前面分别介绍了PGA和SGA的自动内存管理, 这里介绍
  将PGA和SGA两者作为一个整体进行自动管理, 这需要
  设置参数MEMORY_TARGET, 前面介绍的参数均不作设
  置.
• 自动内存管理的好处是实现了在PGA和SGA之间的内存
  转移, 当需要更多的PGA内存时可以将不用的SGA内存
  分配出来, 反之也一样.
  Tip: MEMORY_TARGET参数是一个动态参数, 该参数的大
  小需要小于MEMORY_MAX_TARGET参数的设置, 后者则
  是一个静态参数.
  Tip: 在使用AMM的情况下, 如果设置了SGA_TARGET
  和PGA_AGGREGATE_TARGET参数, 它们会被作为各自的
  最小值使用.
Memory Advisor
• AMM基于内存顾问程序做出内存分配的决策,
  另外也可以通过视图v$pga_target_advice、
  v$sga_target_advice和v$memory_target_advice
  查看这些建议, eg:
SQL Tuning Advisor
• SQL调优顾问程序会对执行的SQL语句进行分析, 并提出相关的SQL调
  优策略, 比如创建索引、使用物化视图或者SQL重写, 也可以手动调
  用SQL调优顾问程序. 该顾问程序执行下面的动作:
 – 统计数据分析(statistics analysis)
   检查是否有失效或者丢失的统计数据, 如果存在则建议更新或者重新创
   建;
 – SQL剖析(SQL Profiling)
   部分执行(partial execution)SQL, 并存储相应的统计信息;
 – 访问路径分析(access paths)
   分析创建索引、物化视图和分区的影响;
 – SQL结构分析(structure analysis)
   尝试重组织SQL语句, 查看是否生成更好的执行计划.
• STA可以使用下面来源的SQL语句进行分析
 –   缓存在共享池中的SQL语句
 –   预先创建的SQL
 –   来自AWR的SQL语句
 –   ad hoc SQL语句
SQL Tuning Advisor
            - DBMS_SQLTUNE
• 使用DBMS_SQLTUNE包的如下过程对SQL语句进行
  分析,
   • CREATE_TUNING_TASK
   • EXECUTE_TUNING_TASK
   • REPORT_TUNINIG_TASK
 分别用于创建、执行SQL语句分析任务和查看结果. 另外
   可以通过如下视图查看SQL语句分析的状态:
 – DBA_ADVISOR_LOG
 查看任务的状态及执行时统计数据.
 – DBA_/USER_ADVISOR_TASKS
 顾问程序任务的详细信息.
 – V$ADVISOR_PROGRESS
 顾问程序任务执行的完成情况和剩余时间.
SQL Tuning Advisor
                     - Demo
• 首先创建示例使用的表
  create table demo.object_analysis as select * from all_objects;
• 创建任务
  variable vtask varchar2(100);
  begin
    :vtask := dbms_sqltune.create_tuning_task(sql_text=>
      'select distinct object_id from demo.object_analysis');
  end;
  /
• 执行任务
  execute dbms_sqltune.execute_tuning_task(:vtask);
• 查看任务结果, 返回的是CLOB字段
  select dbms_sqltune.report_tuning_task(:vtask) from dual;
• 最后删除object_analysis表
    drop table object_analysis;
SQL Access Advisor
                        - DBMS_ADVISOR
•   SQL访问顾问程序主要提供与创建索引、物化视图以及分区相关的优化建议, 可以
    使用dbms_advisor包进行调用, 示例:
    – 调用quick_tune过程
       begin
         dbms_advisor.quick_tune(
           dbms_advisor.sqlaccess_advisor,
           'task1',
           'select distinct object_id from demo.object_analysis');
       end;
       /
    – 创建一个数据库目录, 该目录存储分析结果文件
       create directory tune_scripts as '/tmp/tune_scripts';
    – 将分析结果写入文件
       begin
         dbms_advisor.create_file(
           dbms_advisor.get_task_script('task1'),
           'TUNE_SCRIPTS',
           'tune_fts.sql');
         end;
       /
    – 接下来可以使用操作系统命令查看分析文件的内容, 该文件会包含
    创建相应索引、物化视图等对象的脚本.
END

12, OCP - performance tuning

  • 1.
  • 2.
    Overview • 系统调优是一个涉及面很宽泛的主题, 它可以 分为硬件、软件或者按系统层次分显示层、应 用层、数据库层等. 这一章介绍的是Oracle数 据库层的调优, 着重于一些工具的使用和系统 的配置, 包括: – 使用自动内存管理(Automatic Memory Management) – 使用内存顾问程序(Memory Advisor) 配置自动PGA 内存管理(Automatic PGA Memory Management) – 使用SQL调优顾问程序(SQL Tuning Advisor) – 使用SQL访问顾问程序(SQL Access Advisor)
  • 3.
    Managing Memory - Overview & PGA • Oracle实例的内存管理分为两个部分: PGA内存管理和SGA内存管理. 从9i开 始实现了对PGA内存的自动管理, 10g实现了对SGA内存的自动管理, 在11g 中则更进一步允许将PGA和SGA作为一个整体进行自动管理. • PGA Memory Management – 用户会话由客户端进程和服务端进程组成, 与服务端进程相关联的是PGA内存, 这是每一个会话私有的. PGA内存用于存储与会话相关的数据, 包括: • 临时表数据(temporary tables) • 排序临时数据(sorting rows) • 合并位图(merging bitmaps) • 变量(variables) • 调用堆栈(call stack) 对于会话数据, 有的必须使用PGA内存, 比如调用堆栈; 另外的数据在PGA内存不 够的情况下会使用磁盘空间作为临时的存储, 比如临时表空间. – 在11g版本中PGA内存支持手动管理, 但这只是为了向后兼容. 使用如下两个参 数启用PGA内存的自动管理: • WORKAREA_SIZE_POLICY • PGA_AGGREGATE_TARGET 第一个参数的默认值是AUTO, 表示系统自动为会话分配PGA内存; 第二个参数 表示所有会话PGA内存总和的目标值.
  • 4.
    Managing Memory - SGA • SGA包含以下内存结构, 它们的大小均可以进行独立的设置: – 共享池 数据块缓冲区 – 大池 流池 – Java池 重做日志缓冲区 这里不讨论大池、流池和Java池. Oracle官方推荐除日志缓冲区(由启动参 数log_buffer决定)之外, 对SGA使用自动内存管理, 在这种方式下系统会自 动调节各个组件占用的内存空间, 以达到最佳的效率.使用SGA自动内存管 理需要作如下设置: – 设置SGA_TARGET参数, 该参数表示SGA总体内存的目标值; 将下面所有用户SGA手动管理的参数设置为0: – SHARED_POOL_SIZE – DB_CACHE_SIZE – LARGE_POOL_SIZE – STREAMS_POOL_SIZE – JAVA_POOL_SIZE 在设置了SGA_TARGET参数的情况下, 如果对上述的任意参数设置了大于0的数值, 那么该设置将作为该SGA组件分配内存的最小值, SGA仍使用自动管理.
  • 5.
    Automatic Memory Management - AMM • 前面分别介绍了PGA和SGA的自动内存管理, 这里介绍 将PGA和SGA两者作为一个整体进行自动管理, 这需要 设置参数MEMORY_TARGET, 前面介绍的参数均不作设 置. • 自动内存管理的好处是实现了在PGA和SGA之间的内存 转移, 当需要更多的PGA内存时可以将不用的SGA内存 分配出来, 反之也一样. Tip: MEMORY_TARGET参数是一个动态参数, 该参数的大 小需要小于MEMORY_MAX_TARGET参数的设置, 后者则 是一个静态参数. Tip: 在使用AMM的情况下, 如果设置了SGA_TARGET 和PGA_AGGREGATE_TARGET参数, 它们会被作为各自的 最小值使用.
  • 6.
    Memory Advisor • AMM基于内存顾问程序做出内存分配的决策, 另外也可以通过视图v$pga_target_advice、 v$sga_target_advice和v$memory_target_advice 查看这些建议, eg:
  • 7.
    SQL Tuning Advisor •SQL调优顾问程序会对执行的SQL语句进行分析, 并提出相关的SQL调 优策略, 比如创建索引、使用物化视图或者SQL重写, 也可以手动调 用SQL调优顾问程序. 该顾问程序执行下面的动作: – 统计数据分析(statistics analysis) 检查是否有失效或者丢失的统计数据, 如果存在则建议更新或者重新创 建; – SQL剖析(SQL Profiling) 部分执行(partial execution)SQL, 并存储相应的统计信息; – 访问路径分析(access paths) 分析创建索引、物化视图和分区的影响; – SQL结构分析(structure analysis) 尝试重组织SQL语句, 查看是否生成更好的执行计划. • STA可以使用下面来源的SQL语句进行分析 – 缓存在共享池中的SQL语句 – 预先创建的SQL – 来自AWR的SQL语句 – ad hoc SQL语句
  • 8.
    SQL Tuning Advisor - DBMS_SQLTUNE • 使用DBMS_SQLTUNE包的如下过程对SQL语句进行 分析, • CREATE_TUNING_TASK • EXECUTE_TUNING_TASK • REPORT_TUNINIG_TASK 分别用于创建、执行SQL语句分析任务和查看结果. 另外 可以通过如下视图查看SQL语句分析的状态: – DBA_ADVISOR_LOG 查看任务的状态及执行时统计数据. – DBA_/USER_ADVISOR_TASKS 顾问程序任务的详细信息. – V$ADVISOR_PROGRESS 顾问程序任务执行的完成情况和剩余时间.
  • 9.
    SQL Tuning Advisor - Demo • 首先创建示例使用的表 create table demo.object_analysis as select * from all_objects; • 创建任务 variable vtask varchar2(100); begin :vtask := dbms_sqltune.create_tuning_task(sql_text=> 'select distinct object_id from demo.object_analysis'); end; / • 执行任务 execute dbms_sqltune.execute_tuning_task(:vtask); • 查看任务结果, 返回的是CLOB字段 select dbms_sqltune.report_tuning_task(:vtask) from dual; • 最后删除object_analysis表 drop table object_analysis;
  • 10.
    SQL Access Advisor - DBMS_ADVISOR • SQL访问顾问程序主要提供与创建索引、物化视图以及分区相关的优化建议, 可以 使用dbms_advisor包进行调用, 示例: – 调用quick_tune过程 begin dbms_advisor.quick_tune( dbms_advisor.sqlaccess_advisor, 'task1', 'select distinct object_id from demo.object_analysis'); end; / – 创建一个数据库目录, 该目录存储分析结果文件 create directory tune_scripts as '/tmp/tune_scripts'; – 将分析结果写入文件 begin dbms_advisor.create_file( dbms_advisor.get_task_script('task1'), 'TUNE_SCRIPTS', 'tune_fts.sql'); end; / – 接下来可以使用操作系统命令查看分析文件的内容, 该文件会包含 创建相应索引、物化视图等对象的脚本.
  • 11.