统计信息收集
作用: DBMS_STATS.GATHER_TABLE_STATS统计表,列,索引的统计信息(默认参数下是对表进行直方图信息收集,包含该表的自身-表的行数、数据块数、行长等信息;列的分析--列值的重复数、列上的空值、数据在列上的分布情况;索引的分析-索引页块的数量、索引的深度、索引聚合因子)
DBMS_STATS.GATHER_TABLE_STATS的语法如下:
sql
DBMS_STATS.GATHER_TABLE_STATS ( ownname VARCHAR2, tabname VARCHAR2, partname VARCHAR2, estimate_percent NUMBER, block_sample BOOLEAN, method_opt VARCHAR2, degree NUMBER, granularity VARCHAR2, cascade BOOLEAN, stattab VARCHAR2, statid VARCHAR2, statown VARCHAR2, no_invalidate BOOLEAN, force BOOLEAN);
参数说明:
ownname:要分析表的拥有者
tabname:要分析的表名.
partname:分区的名字,只对分区表或分区索引有用.
estimate_percent:采样行的百分比,取值范围[0.000001,100],null为全部分析,不采样.常量:DBMS_STATS.AUTO_SAMPLE_SIZE是默认值,由oracle决定最佳取采样值.
block_sapmple:是否用块采样代替行采样.
method_opt:决定histograms信息是怎样被统计的.method_opt的取值如下(默认值为FOR ALLCOLUMNS SIZE AUTO):
for all columns:统计所有列的histograms.
for all indexed columns:统计所有indexed列的histograms.
for all hidden columns:统计你看不到列的histograms
for columns SIZE | REPEAT | AUTO |SKEWONLY:统计指定列的histograms.N的取值范围[1,254];REPEAT上次统计过的histograms;AUTO由oracle决定N的大小;SKEWONLY multipleend-points with the same value which is what we define by "there isskew in thedata
degree:决定并行度.默认值为null.
granularity:Granularity of statisticsto collect ,only pertinent if the table is partitioned.
cascade:是收集索引的信息.默认为FALSE.
stattab:指定要存储统计信息的表,statid如果多个表的统计信息存储在同一个stattab中用于进行区分.statown存储统计信息表的拥有者.以上三个参数若不指定,统计信息会直接更新到数据字典.
no_invalidate: Does not invalidate thedependent cursors if set to TRUE. The procedure invalidates thedependent cursors immediately if set to FALSE.
force:即使表锁住了也收集统计信息.
例子:
sql
begin
dbms_stats.gather_table_stats(ownname => 'HXAPP',tabname => 'kcgb_sfdjbu',estimate_percent => 10,method_opt=> 'for all indexed columns',cascade=>TRUE);
end;
可以查看dbms_stats包里面的各个存储过程来使用
分析数据库(包括所有的用户对象和系统对象):dbms_stats.gather_database_stats()
分析用户所有的对象(包括表、索引、簇):dbms_stats.gather_schema_stats()
分析表:dbms_stats.gather_table_stats()
分析索引:dbms_stats.gather_index_stats()
删除数据库统计信息:dbms_stats.delete_database_stats()
删除用户方案统计信息:dbms_stats.delete_schema_stats()
删除表统计信息:dbms_stats.delete_table_stats()
删除索引统计信息:dbms_stats.delete_index_stats()
删除列统计信息:dbms_stats.delete_column_stats()
设置表统计信息:dbms_stats.set_table_stats()
设置索引统计信息:dbms_stats.set_index_stats()
设置列统计信息:dbms_stats.set_column_stats()
导出整个schema的统计信息:dbms_stats.export_schema_stats()
可以查看表 DBA_TABLES来查看表是否与被分析过,如:
SELECT TABLE_NAME, LAST_ANALYZED FROM DBA_TABLES
分析表和索引
例子
在测试收取费用时,发现收费登记簿按照index_odb1索引查询和更新特别慢,并且对表进行统计信息收集后依然无法解决,在网上查到了analyze工具,在执行了
analyze table xxxx_sfdjbu compute statistics for table for all indexes for all indexed columns;
命令后,之前耗时40秒左右的慢SQL基本不会出现了。
- 首先查询长期锁表SQL的sid
sql
SELECT b.sid,
b.serial#,
b.logon_time,
b.username,
b.osuser,
a.object_name,
'alter system kill session ''' || b.sid || ',' || b.serial# || ''';' AS kill
FROM (SELECT s.*, t.object_name
FROM v$locked_object s, dba_objects t
WHERE s.object_id = t.object_id) a
LEFT OUTER JOIN v$session b
ON a.session_id = b.sid
ORDER BY b.logon_time, b.sid;
- 然后根据sid查询SQL计划等信息
sql
SELECT * FROM v$session t WHERE t.SID = '10407';
SELECT * FROM v$sql t WHERE t.SQL_ID = '9tpmx87nz4jzh';
SELECT * FROM v$sql_plan t WHERE t.SQL_ID = '9tpmx87nz4jzh';
SELECT * FROM v$sqlarea t WHERE t.SQL_ID = '9tpmx87nz4jzh';
SELECT * FROM v$session t WHERE t.SID = '10407';
SELECT * FROM v$sql t WHERE t.SQL_ID = '56a5h016rxdx8';
SELECT * FROM v$sql_plan t WHERE t.SQL_ID = '56a5h016rxdx8';
SELECT * FROM v$sqlarea t WHERE t.SQL_ID = '56a5h016rxdx8';
发现对应的SQL没有按照索引执行,执行对应表的分析表和索引命令进行优化。
以下为网上查询到的信息
- 分析表
sql
analyze table tablename compute statistics;
- 分析索引
sql
analyze index indexname compute statistics;
该语句生成的统计信息会更新user_tables这个视图的统计信息,分析的结果被Oracle用于基于成本的优化生成更好的查询计划
对于使用CBO(Cost-Base Optimization)很有好处,可以使用更可靠的table信息,从而执行计划也可以更准确一些,在10g会自动analyze,之前的版本需要手动定期
analyze table 一般可以指定分析: 表,所有字段,所有索引字段,所有索引。 若不指定则全部都分析。
sql
analyze table my_table compute statistics;
analyze table my_table compute statistics for table for all indexes for all columns;
analyze table my_table compute statistics for table for all indexes for all indexed columns;
analyze table my_table compute statistics;
等价于:
analyze table my_table compute statistics for table for all indexes for all columns;
例子:
sql
analyze table t1 compute statistics for table;
analyze table t2 compute statistics for all columns;
analyze table t3 compute statistics for all indexed columns;
analyze table t5 compute statistics for all indexes;
analyze table t4 compute statistics;
另外,可以删除分析数据:
sql
analyze table my_table delete statistics;
analyze table my_table delete statistics for table for all indexes for all indexed columns;