Oracle半小时统计:拨开神秘的面纱
相信不少人都对Oracle数据库的性能分析和优化有所经验,但是对于Oracle的统计信息却可能不甚清楚。统计信息是 Oracle 数据库的基础,它是用来描述对象、表和索引等数据库元数据的一些数据,无论是基于CBO还是RBO的执行计划都需要依赖这些信息来做出正确的决策,这些信息包括表记录数、列的值域(进行直方图统计用的数据)界限值,索引等等。因此,构建一个完美的统计信息库至关重要。
在本文中,我们将介绍一种快速生成Oracle统计信息的方法,而且只需半小时即可完成,令人倍感心旷神怡。
【前置知识】
为了更好地理解本文中的概念,我们需要了解Oracle数据库中与统计相关的四个参数:
– TIMED_STATISTICS:为TRUE时,Oracle将统计信息和时间统计信息写入数据字典。在使用awrrpt.sql脚本生成Oracle数据库性能分析报告时,该参数必须为TRUE.
– STATISTICS_LEVEL:用于控制Oracle运行时的统计信息级别。其取值为ALL、TYPICAL或BASIC。默认值为TYPICAL.
– DBMS_STATS.AUTO_STATS_JOB_ENABLED:如为TRUE,则开启一个后台任务,每晚1点开始重新收集统计信息。
– DBMS_STATS.GATHER_TABLE_STATS(schema name=>table name):该过程可以重新生成数据表统计信息。
【方法】
1.启动统计信息收集
打开SQL*PLUS,运行以下命令:
EXEC DBMS_STATS.SET_TABLE_PREFS(‘SCOTT’,’EMP’,’ESTIMATE_PERCENT’,11);
EXEC DBMS_STATS.GATHER_TABLE_STATS(‘SCOTT’,’EMP’,CASCADE=>TRUE,GRANULARITY=>’ALL’,METHOD_OPT=>’FOR ALL COLUMNS SIZE 1′);
2.等待统计信息生成
我们需要预留一定时间,确保 Oracle 完成统计信息的生成。对于小型数据库,建议等待10分钟。同时,使用以下SQL语句检查统计信息的实时更新情况:
SELECT OWNER,TABLE_NAME,LAST_ANALYZED,NUM_ROWS,LAST_SAMPLE_SIZE FROM DBA_TABLES WHERE OWNER = ‘SCOTT’ AND TABLE_NAME = ‘EMP’;
如果统计信息还在生成中,可使用以下命令查看:
SELECT COUNT(*) FROM DBA_TAB_STATS_HISTORY WHERE OWNER = ‘SCOTT’ AND TABLE_NAME = ‘EMP’;
3.查看表的统计信息
完成统计信息的生成,我们可以通过以下两种方式查看统计信息:
方式1 :使用 Oracle SQL Developer中的表属性窗口
在此窗口中,我们可以查看对象(表)的统计信息,并导出生成的HTML报表。
PS:SQL Developer 是 Oracle 官方提供的功能强大,广泛使用的免费 GUI 工具,用于开发、测试、调试和部署 Oracle 数据库。
方式2 :通过 Direct Path Load
运行以下代码(前提是需要将表空间设置为无限的):
INSERT /*+ APPEND */ INTO t1 SELECT ROWNUM, TRUNC(DBMS_RANDOM.VALUE(1,1000)) FROM dual CONNECT BY LEVEL
接下来,通过以下查询语句可以查看表自动收集的统计信息:
SELECT * FROM DBA_TAB_STATISTICS WHERE TABLE_NAME = ‘T1’;
4.刷新统计信息
如果需要更改数据库的统计信息,可以使用以下SQL命令:
SELECT DBMS_STATS.GET_PREFS(‘SCOTT’);
EXEC DBMS_STATS.SET_TABLE_PREFS(‘SCOTT’,’EMP’,’ESTIMATE_PERCENT’,50);
SELECT DBMS_STATS.GET_PREFS(‘SCOTT’);
EXEC DBMS_STATS.GATHER_TABLE_STATS(‘SCOTT’,’EMP’,CASCADE=>TRUE,GRANULARITY=>’ALL’,METHOD_OPT=>’FOR ALL COLUMNS SIZE 1′);
再次等待更新后,我们又可以查看新的统计信息了。
【注意事项】
还需要了解以下几点:
– 对于大型数据库,一般应选择自动收集统计信息并创建计划任务,以便它们在后台运行。
– 统计信息需要持续更新,否则会导致性能下降。建议对频繁使用的表进行一些定制,以根据情况决定何时更新统计信息。
– 统计信息的生成可能影响I/O性能,因此最好单独在非繁忙时段进行收集。
以上是本文的全部内容,Oracle的统计信息并不神秘,只要你掌握正确的方法,就能轻易实现快速生成,并大大提高数据库性能的效率。