首页 > 数据库 > Oracle > 改进数据库性能-SQL查询优化
首先、这个部分主要是针对oracle11g(管理艺术)相关章节做的笔记,方便自己有一个系统全面的理论指导。
调优的方法论:
oracle11g增强了主动调优proactive tuning,被动的性能优化reactive performance tuning
优化SQL的查询处理:
首先需要了解SQL处理的过程和优化要点
SQL语句经历了语句分析parsing、优化optimizing、和执行executing阶段,如果是查询语句,数据要能够被检索,那么在SQL处理之前还有一个额外的获取(fetch)阶段
语法分析:
主要有语法和语义,分解成关系代数查询,检查过程中参照数据字典(缓存和基表)
优化:
使用优化程序CBO来选择最好的访问方法来查询所涉及的表和索引的检索数据,分为查询重写阶段和物理执行计划生成
执行计划生成阶段:
生成几个有效的物理查询计划,然后对他们进行成本估算,选择估算值最低的执行计划。
执行阶段:select-直接返回查询结果:insert update delete语句记录被修改
最重要的就是查询优化处理阶段---它决定了快速检索数据所涉及的所有重要问题。
统计数据:
oracle11g一般每天晚上10-早上6点以及周末的全天打开。gather_stats_job作业,可以禁用
gather_stats_job为所有没有优化程序统计数据,对一个对象,如果修改了10%的数据-就统计,可以通过DBA_TAB_MODIFICATIONS视图相关更改信息
DBA_tables—last_analyzed 提示的上次统计的时间,sample_size采样(表大小和采样百分比没有关系),没有变化的数据就不会做统计分析
必要的统计数据:
OPTIMIZER_MODE参数
all_rows,这个是默认的,以实现最大吞吐量
first_row_n:实现响应时间
first_row:使用探测法(经验规则)无论是否有统计数据,响应时间最小。
优化程序做什么:
1、SQL转换
常用的转换:
2、选择访问路径
3、选择联结方法
4、选择联结次序
联结方式消除最大数目的行数据
CBO缺点:
收集统计数据:
DBMS_stats
必须手工收集统计数据:
可以收集数据库、表、索引、用户模式
gather_database_statistics
gather_schema_statistics
gather_table_statistics
gather_index_statistics
estimate_percent--统计的百分比,如果是null就是全部
method_opt执行是否收集直方图
granularity :all 所有表的子分区、分区
cascade=yes就是所有的索引统计数据
option
gather为所有的对象搜索统计信息
gather_auto只对那些ORACLE人为必要的对象收集
gather_empty为没有收集过的收集统计信息
gather_stale只对那些过期的收集
收集系统统计数据
DBMS_STATS.GATHER_SYSTEM_STATS
包括IO 和CPU(无负荷模式和负荷模式)
收集数据字典统计数据
DBMS_STATS.gather_database_stats 中gather_sys=yes
DBMS_STATS.gather_dictionary_stats
动态采样optimizer_dynamic_sampling在表中不存在统计数据或者信息过旧的时候,让ORACLE即时估算优化程序统计数据。
高效SQL
联结方法:
索引:
对什么进行索引
B树索引
位图索引
IOT索引组织表
反向索引
函数索引
组合索引
使用绑定变量
避免全表扫描
DBA:
分区表
压缩技术
物化视图
使用存储大纲保证稳定性
SQL计划管理SPM
SQL baseline
并行执行
性能分析工具
explain plan
utlxplan.sql--创建分析表
utlxpls.sql格式化
autotrace
SQLTRACE+tkprof
第三方工具
端对端跟踪
DBMS_MONITOR
需要三个属性:
客户端标示符
服务名称
模块名称 服务名称以及活动名称的组合
利用触发器铺货客户端连接到DB的sessionID
结果高速缓存
客户端高速缓存
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/500314/viewspace-1163643/ ,如需转载,请注明出处,否则将追究法律责任。