为准确生成执行计划更新统计信息-analyze与dbms_stats
2015-04-29 22:57
316 查看
如果我们想让CBO利用合理利用数据的统计信息,正确判断执行任何SQL查询时的最快途径,需要及时的使用analyze命令或者dbms_stats重新统计数据的统计信息.
例如索引跳跃式扫描(INDEX SKIP SCAN)例子中,如果不对表EMPLOYEE 及索引收集一下统计信息,就不是INDEX SKIP SCAN策略了。
在oracle 8i以前,主要是用ANALYZE命令。在ORACLE 8I以后,又引入了DBMS_STATS存储包来进行分析。幸运的是从ORACLE 10G以后,分析工作变成自动的了,这减轻的DBA的负担
for all indexes的统计信息存在于视图: user_indexes 、all_indexes、dba_indexes
for all columns的统计信息存在于试图:user_tab_columns、all_tab_columns、dba_tab_columns
删除只是某些列变为空,如emp表的行数为空了
语法:
dbms_stats.delete_table_stats 用于删除统计信息。
例子:
http://docs.oracle.com/database/121/TGSQL/tgsql_stats.htm#TGSQL389
例如索引跳跃式扫描(INDEX SKIP SCAN)例子中,如果不对表EMPLOYEE 及索引收集一下统计信息,就不是INDEX SKIP SCAN策略了。
在oracle 8i以前,主要是用ANALYZE命令。在ORACLE 8I以后,又引入了DBMS_STATS存储包来进行分析。幸运的是从ORACLE 10G以后,分析工作变成自动的了,这减轻的DBA的负担
分析统计信息
analyze table 一般可以指定分析: 表,所有字段,所有索引字段,所有索引。 若不指定则全部都分析。---table统计信息 analyze table EMP compute statistics for table; ---column统计信息 analyze table EMP compute statistics for all columns; ---索引统计信息 analyze table EMP compute statistics for all indexes; ---索引列统计信息 analyze table EMP compute statistics for all indexed columns; ---效果等于 analyze table tablename compute statistics for table for all indexes for all columns analyze table tablename compute statistics
查看统计信息
for table的统计信息存在于视图:user_tables 、all_tables、dba_tablesfor all indexes的统计信息存在于视图: user_indexes 、all_indexes、dba_indexes
for all columns的统计信息存在于试图:user_tab_columns、all_tab_columns、dba_tab_columns
SCOTT@PDBORCL> analyze table EMP compute statistics for table; 表已分析。 SCOTT@PDBORCL> analyze table EMP compute statistics for all columns; 表已分析。 SCOTT@PDBORCL> analyze table EMP compute statistics for all indexes; 表已分析。 SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = 'EMP';
TABLE_NAME NUM_ROWS ----------- -----------
EMP 14 SCOTT@PDBORCL> select index_name,uniqueness from user_indexes where table_name = 'EMP';
INDEX_NAME UNIQUENES -------- --------- PK_EMP UNIQUE SCOTT@PDBORCL> select column_name,data_type from user_tab_columns where table_name = 'EMP' ; COLUMN_NAME DATA_TYPE -------------------------
EMPNO NUMBER ENAME VARCHAR2 JOB VARCHAR2 MGR NUMBER HIREDATE DATE SAL NUMBER COMM NUMBER DEPTNO NUMBER 已选择 8 行。 SCOTT@PDBORCL> ^A
删除统计信息
会删除emp所有的statistics。analyze table emp delete statistics
删除只是某些列变为空,如emp表的行数为空了
SCOTT@PDBORCL> analyze table emp compute statistics; 表已分析。 SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = 'EMP'; TABLE_NAME NUM_ROWS -------- ---------- EMP 14 SCOTT@PDBORCL> analyze table emp delete statistics; 表已分析。 SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = 'EMP'; TABLE_NAME NUM_ROWS -------- ---------- EMP SCOTT@PDBORCL>
dbms_stats
dbms_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 );
dbms_stats.delete_table_stats 用于删除统计信息。
例子:
------删除统计信息SCOTT@PDBORCL> exec dbms_stats.delete_table_stats (ownname => 'scott',tabname => 'emp'); PL/SQL 过程已成功完成。 ----查询统计信息 SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = 'EMP'; TABLE_NAME NUM_ROWS -------- ---------- EMP ---获取统计信息SCOTT@PDBORCL> exec dbms_stats.gather_table_stats (ownname => 'scott',tabname => 'emp'); PL/SQL 过程已成功完成。 ---重新查新统计信息 SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = 'EMP'; TABLE_NAME NUM_ROWS -------- ---------- EMP 14 SCOTT@PDBORCL>
参考:
为准确生成执行计划更新统计信息-analyzehttp://docs.oracle.com/database/121/TGSQL/tgsql_stats.htm#TGSQL389
相关文章推荐
- 为准确生成执行计划更新统计信息-analyze与dbms_stats
- 利用DBMS_STATS包修改统计信息,欺骗优化器,生成糟糕的执行计划
- 利用DBMS_STATS包修改统计信息,欺骗优化器,生成糟糕的执行计划
- 表分析 analyze 及dbms_stats 提高执行计划准确性
- 准确的统计信息是执行计划正确的基本前提,6.8小时-->9秒
- 当统计信息不准确时,CBO可能产生错误的执行计划,并在10053 trace中找到CBO出错的位置示例
- mysql innodb 如何获取用于 生成执行计划的 数据表统计信息
- 是什么引起执行计划变得极其糟糕? 应该使用更新统计信息来解决它吗?
- ArcSDE for Oracle在大数据量执行创建统计信息(Analyze)耗时长的问题
- Oracle CBO 统计信息的收集与执行计划的选择
- 执行计划之统计信息
- SQL执行计划及统计信息相关视图
- SQL Server 执行计划利用统计信息对数据行的预估原理以及SQL Server 2014中预估策略的改变
- 数据库性能优化、统计信息与对象统计信息概述收集、扩展统计信息、dbms_stats.get_prefs
- 统计信息对执行计划的影响
- 收集到较为直观和详细的执行计划和相关统计信息
- 修改10g自动统计信息收集作业GATHER_STATS_JOB到仅仅周末执行
- 通过锁定统计信息来锁定执行计划
- 删除重复值【根据两个字段判断】(只保留一个)&查看执行计划&统计信息