数据库性能优化
相关书籍:
1.基于成本的Oracle优化法则
2.Oracle性能诊断艺术
3.基于Oracle的SQL优化
-----------------------------------------------------------------------------------------
两种优化器:
CBO cost-base optimizer
基于cost 更大适应性/灵活性/10g开始
RBO rule-base optimizer
基于规则 制定了15条/10g以前
-------------------------------------------------------------------------------------------
统计信息:
1.系统统计信息
cpu、I/O
exec dbms_stats.gather_system_stats;
2.数据库对象统计信息
表、索引、列、扩展
exec dbms_stats.gather_table_stats('TEST_USER1','TEST_1');
--收集表的统计信息(同时会级联收集索引和列的统计信息)
exec dbms_stats.gather_table_stats('TEST_USER1','TEST_1',cascade=>false);
--不会联机收集索引和列的统计信息
exec dbms_stats.gather_index_stats('TEST_USER1','INDEX_NAME');
--收集索引的统计信息
alter table table_name enable row movement;
--允许表的行迁移
alter table table_name shrink space;
--降低表的高水位线
exec dbms_stats.gather_database_stats;
--收集整个数据库的统计信息
-------------------------------------------------------------------------------------------
直方图
扩展统计信息
桶
query rewrite 查询重写
星形转换
视图合并
为此前推
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
1,统计信息概述
统计信息是oracle CBO计算候选执行计划的cost的基础。因此,获取准确的统计信息,
是oracle能够选择最优执行计划(cost最低)的首要条件。
在oracle 9i的时候,oracle只计算每个执行计划的I/O成本,并将其作为评价执行计划好坏的依据。
从10g开始,oracle将sql执行中消耗的cpu资源,也作为成本计入执行计划的成本计算。
因此,一个执行计划的cost值,包含了cpu和I/O两种资源的成本。
与统计信息相关的几个初始化参数
SQL> show parameter statistics;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
optimizer_use_pending_statistics boolean FALSE
statistics_level string TYPICAL
timed_os_statistics integer 0
timed_statistics boolean TRUE
optimizer_use_pending_statistics:
显示CBO是否使用pending状态的统计信息。
一般情况下,我们收集完统计信息,则oracle会默认将新收集到的统计信息置于publish状态,这样CBO可以随时使用。
我们可以使用dbms_stats.DELETE_PENDING_STATS删除处于pending状态的统计信息,也可以使用
dbms_stat.set_*_prefs来设置统计信息是否处于publish状态。
timed_statistics
是否收集与时间相关的统计信息。例如cpu和elapsed times。
如果STATISTICS_LEVEL设置为TYPICAL或者ALL, 则该参数的默认值为true;
如果STATISTICS_LEVEL设置为BASIC, 则该参数的默认值为false。
从11.1.0.7.0开始,如果STATISTICS_LEVEL设置为TYPICAL或者ALL,该参数不能被设置为false。
timed_os_statistics
该参数指定了当从客户端生成一个请求,或者完成一个请求的时候,收集系统统计信息的时间间隔(单位为s)。这又分了两种情况:
dedicated 模式
在用户登录和后继客户端通过OCI调用从而作为一个远程过程调用信息进入oracle server时,oracle收集系统统计信息。
shared 模式
在客户端调用oracle完成时,oracle收集系统统计信息。
如果STATISTICS_LEVEL设置为ALL, 则该参数默认值为5;
如果STATISTICS_LEVEL设置为BASIC或者TYPICAL, 则该参数默认值为0。
需要注意的是,收集系统统计信息是相当消耗系统资源的活动。oracle强烈建议你在完成系统统计信息收集之后,立即将该参数修改为0。
statistics_level
控制收集统计信息的级别,有三个参数值:
BASIC :收集基本的统计信息
TYPICAL:收集大部分统计信息(数据库的默认设置)
ALL:收集全部统计信息,除了收集typical模式下的所有统计信息之外,还将收集基于时间的os统计信息和执行计划的统计信息。
(执行计划的统计信息包括什么)
如果将默认值typical改为basic,则将停止收集如下对象的统计信息:
Automatic Workload Repository (AWR) Snapshots
Automatic Database Diagnostic Monitor (ADDM)
All server-generated alerts
Automatic SGA Memory Management
Automatic optimizer statistics collection
Object level statistics
End to End Application Tracing (V$CLIENT_STATS)
Database time distribution statistics (V$SESS_TIME_MODEL and V$SYS_TIME_MODEL)
Service level statistics
Buffer cache advisory
MTTR advisory
Shared pool sizing advisory
Segment level statistics
PGA Target advisory
Timed statistics
Monitori