-- Start
统计信息相当于情报,对 Oracle 至关重要,如果统计信息不准确,Oracle 就会做出错误的判断。那如何查看统计信息呢?试一试下面的 SQL 吧。
-- 查看表统计信息
select * from DBA_TABLES where OWNER = 'HR' and TABLE_NAME = 'TEST';
select * from DBA_TAB_STATISTICS where OWNER = 'HR' and TABLE_NAME = 'TEST';
-- 查看列统计信息
select * from DBA_TAB_COL_STATISTICS where OWNER = 'HR' and TABLE_NAME = 'TEST';
-- 查看索引统计信息
select * from DBA_IND_STATISTICS where OWNER = 'HR' and TABLE_NAME = 'TEST';
通常,Oracle 会在每天固定时间段自动维护统计信息。但是对于某些表,这是远远不够的,如:某些表每天都需要清空,然后重新导入。这个时候,我们需要手动收集统计信息。
-- 方法1: 使用 DBMS_STATS.GATHER_TABLE_STATS 手动收集存储过程
DBMS_STATS.GATHER_TABLE_STATS('HR', 'ORDERS');
-- 方法2:删除并锁定统计信息,如果没有统计信息,Oracle 会动态收集统计信息
BEGIN
DBMS_STATS.DELETE_TABLE_STATS('HR','ORDERS');
DBMS_STATS.LOCK_TABLE_STATS('HR','ORDERS');
END;
Oracle 推荐我们使用方法1。 除此之外,DBMS_STATS 包还提供了下面的存储过程用来收集统计信息。
GATHER_INDEX_STATS 收集索引统计信息
GATHER_TABLE_STATS 收集指定表,列,索引的统计信息
GATHER_SCHEMA_STATS 收集指定模式下所有对象的统计信息
GATHER_SYSTEM_STATS 收集系统统(I/O,CUP)计信息
GATHER_DICTIONARY_STATS 收集 SYS, SYSTEM 模式下对象的统计信息
GATHER_DATABASE_STATS 收集所有数据库对象的统计信息
GATHER_FIXED_OBJECTS_STATS 收集 FIXED 对象的统计信息
DBMS_STATS 包还提供许多子程序让我们可以对统计信息进行操作,如:查询,删除,锁定,恢复等,更多详情你可以参考 PL/SQL Packages and Types 手册。
-- 更多参见:Oracle SQL 优化精萃
-- 声明:转载请注明出处
-- Last edited on 2015-08-28
-- Created by ShangBo on 2015-07-29
-- End