为准确生成执行计划更新统计信息-analyze与dbms_stats
为准确生成执行计划更新统计信息-analyze与dbms_stats
小强斋太 发表于1年前
为准确生成执行计划更新统计信息-analyze与dbms_stats
  • 发表于 1年前
  • 阅读 8
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

如果我们想让CBO利用合理利用数据的统计信息,正确判断执行任何SQL查询时的最快途径,需要及时的使用analyze命令或者dbms_stats重新统计数据的统计信息.

例如索引跳跃式扫描(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_tables

for 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>

参考:

为准确生成执行计划更新统计信息-analyze

http://docs.oracle.com/database/121/TGSQL/tgsql_stats.htm#TGSQL389

共有 人打赏支持
粉丝 0
博文 181
码字总数 0
×
小强斋太
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: