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

如果我们想让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

posted on   小强斋太  阅读(4824)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

目录导航

点击右上角即可分享
微信分享提示