天萃荷净

分享一篇关于Oracle数据库收集统计信息的办法,Oracle DBMS_STATS与Oracle analyze使用方法案例

今天群里面讨论DBMS_STATS和analyze,这里进行了一些测试和猜测

1.创建模拟环境

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

PL/SQL Release 11.2.0.3.0 - Production

CORE 11.2.0.3.0 Production

TNS for Solaris: Version 11.2.0.3.0 - Production

NLSRTL Version 11.2.0.3.0 - Production

SQL> conn oracleplus/oracleplus

Connected.

SQL> create table t_oracleplus

2 as

3 select * from dba_objects;

Table created.

SQL> select object_name,TO_CHAR(last_ddl_time,'YYYY-MM-DD HH24:MI:SS')

2 from dba_objects where object_name='T_oracleplus';

OBJECT_NAME TO_CHAR(LAST_DDL_TI

--------------- -------------------

T_oracleplus 2012-08-28 18:33:03

SQL> select owner,to_char(LAST_ANALYZED,'YYYY-MM-DD HH24:MI:SS')

2 from dba_tables where table_name='T_oracleplus';

OWNER TO_CHAR(LAST_ANALYZ

------------------------------ -------------------

oracleplus

2.DBMS_STATS测试

SQL> EXEC DBMS_STATS.gather_table_stats(user,'T_oracleplus');

PL/SQL procedure successfully completed.

SQL> select owner,to_char(LAST_ANALYZED,'YYYY-MM-DD HH24:MI:SS')

2 from dba_tables where table_name='T_oracleplus';

OWNER TO_CHAR(LAST_ANALYZ

------------------------------ -------------------

oracleplus 2012-08-28 18:42:50

SQL> select object_name,TO_CHAR(last_ddl_time,'YYYY-MM-DD HH24:MI:SS')

2 from dba_objects where object_name='T_oracleplus';

OBJECT_NAME TO_CHAR(LAST_DDL_TI

--------------- -------------------

T_oracleplus 2012-08-28 18:33:03

这里测试证明:DBMS_STATS包的只是收集了表的统计信息,并没有修改DBA_OBJECTS.last_ddl_time列的内容,也就是说这个操作不是ddl操作

3.analyze测试

SQL> analyze table t_oracleplus compute statistics;

Table analyzed.

SQL> select object_name,TO_CHAR(last_ddl_time,'YYYY-MM-DD HH24:MI:SS') from dba_objects where object_name='T_oracleplus';

OBJECT_NAME TO_CHAR(LAST_DDL_TI

--------------- -------------------

T_oracleplus 2012-08-28 18:33:03

SQL> select owner,to_char(LAST_ANALYZED,'YYYY-MM-DD HH24:MI:SS') from dba_tables where table_name='T_oracleplus';

OWNER TO_CHAR(LAST_ANALYZ

------------------------------ -------------------

oracleplus 2012-08-28 18:45:17

这里测试结果显示和DBMS_STATS相同

4.测试DBMS_STATS 类似DDL功能

--会话1

SQL> delete from t_oracleplus;

14292 rows deleted.

SQL> EXEC DBMS_STATS.gather_table_stats(user,'T_oracleplus');

PL/SQL procedure successfully completed.

--会话2

SQL> select count(*) from t_oracleplus;

COUNT(*)

----------

0

--执行DBMS_STATS后事务提交,类此如在

DBMS_STATS分析事务提交原因

SQL> conn / as sysdba

Connected.

SQL> oradebug setmypid

Statement processed.

SQL> oradebug EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12

Statement processed.

SQL> EXEC DBMS_STATS.gather_table_stats('oracleplus','T_oracleplus');

PL/SQL procedure successfully completed.

SQL> oradebug TRACEFILE_NAME

/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_24022.trc

SQL> oradebug EVENT 10046 trace name context off

Statement processed.

--分析trace文件中头几条sql语句

BEGIN DBMS_STATS.gather_table_stats('oracleplus','T_oracleplus'); END;

SELECT SPARE4 FROM SYS.OPTSTAT_HIST_CONTROL$ WHERE SNAME = :B1

COMMIT

SELECT P.VALCHAR FROM SYS.OPTSTAT_USER_PREFS$ P, OBJ$ O, USER$ U WHERE P.OBJ#=O.OBJ#

AND U.USER#=O.OWNER# AND U.NAME=:B3 AND O.NAME=:B2 AND P.PNAME=:B1

通过这里的分析,我们可以大概的知道,为什么执行DBMS_STATS包之后事务自动提交,是因为在该程序中有COMMIT直接提交事务.

5.通过第三方程序UNWRAP DBMS_STAT包

PROCEDURE INIT_PARAM_DEFAULT IS

PARAMS PARARRAY;

ISDEFAULT SYS.OPTSTAT_HIST_CONTROL$.SPARE1%TYPE;

PAREXIST BOOLEAN;

CUR_TIME TIMESTAMP WITH TIME ZONE := SYSTIMESTAMP;

BEGIN

FILL_IN_PARAMS(PARAMS);

FOR I IN 1..PARAMS.COUNT LOOP

DBMS_STATS_INTERNAL.GET_PARAM_PROP(PARAMS(I).PNAME,

PAREXIST, ISDEFAULT);

IF (PAREXIST = TRUE AND ISDEFAULT = 1) THEN

DBMS_STATS_INTERNAL.SET_PARAM(PARAMS(I).PNAME,

PARAMS(I).PVALNUM, PARAMS(I).PVALVCHAR,

CUR_TIME, PARAMS(I).ISDEFAULT);

ELSIF (PAREXIST = FALSE) THEN

DBMS_STATS_INTERNAL.ADD_PARAM(PARAMS(I).PNAME,

PARAMS(I).PVALNUM, PARAMS(I).PVALVCHAR,

CUR_TIME, PARAMS(I).ISDEFAULT);

END IF;

END LOOP;

COMMIT;

通过这里可以看到我们在使用DBMS_STAT收集统计信息时,在初始化默认参数的时候,会执行COMMIT操作.

测试 analyze 类似DDL功能

--session 1

SQL> insert into t_oracleplus select * from dba_objects where rownum<10;

9 rows created.

SQL> analyze table oracleplus.t_oracleplus compute statistics;

Table analyzed.

SQL> select count(*) from t_oracleplus;

COUNT(*)

----------

0

--session 2

SQL> select count(*) from t_oracleplus;

COUNT(*)

----------

9

--证明analyze隐式提交了会话,类此ddl功能

分析analyze事务提交原因

SQL> oradebug setmypid

Statement processed.

SQL> oradebug EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12

Statement processed.

SQL> analyze table oracleplus.t_oracleplus compute statistics;

Table analyzed.

SQL> oradebug TRACEFILE_NAME

/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_27497.trc

SQL> oradebug EVENT 10046 trace name context off

Statement processed.

--分析trace主要操作如下

delete:sys.mon_mods$,sys.mon_mods_all$,superobj$,tab_stats$

update:tab$,hist_head$

从10046中未看到明显的commit,但是里面有不少delete和update的dml操作,那肯定有提交,可能在10046中没有显示出来.

6.总结说明

1.通过观察dba_objects.last_ddl_time列,发现收集统计信息未能是的该列发生变化,从而猜测收集统计信息是dml操作

2.通过DBMS_STATS和analyze事务的测试,证明这些操作可以提交事务

3.通过分析发现DBMS_STATS在设置默认值的时候,会显式commit

4.通过分析analyze发现其本质就是对一些数据的delete+update操作,并没有修改这些对象的结构,在提交这些记录的时候,隐式提交了以前事务

5.最终总结:数据库收集统计信息是dml操作

--------------------------------------ORACLE-DBA----------------------------------------

最权威、专业的Oracle案例资源汇总之【学习笔记】Oracle数据库收集统计信息的两种方法介绍案例

oracle事务数统计,【学习笔记】Oracle数据库收集统计信息的两种方法介绍案例相关推荐

  1. 学习笔记:获取字符串中数字的两种方法

    方法一:正则表达式法 var s = "123半234月789谈000"; a = s.replace(/[^0-9]/ig, ""); console.log ...

  2. mysql php gpl_MySQL_MySQL数据库远程访问权限如何打开(两种方法),下载GPL版本安装MySQL Community - phpStudy...

    MySQL数据库远程访问权限如何打开(两种方法) 下载GPL版本安装 MySQL Community Edition(GPL) Community (GPL) Downloads » 在我们使用mys ...

  3. oracle常用数据统计,学习笔记:Oracle DBMS_STATS常用方法汇总 常用于收集统计oracle...

    天萃荷净 Oracle数据库中DBMS_STATS常用方法(收集oracle数据库.索引.表等信息) –收集Oracle数据库信息命令 EXEC DBMS_STATS.gather_database_ ...

  4. oracle 最大值及其_学习笔记:Oracle优化 SQL查询最大值 最小值时的优化方法案例...

    天萃荷净 select max(id),min(id) from table优化,分享开发DBA需求,在SQL语句查询最大值.最小值数据时的优化方式案例 1.查看数据库版本 SQL> selec ...

  5. oracle 删除awr报告,学习笔记:Oracle awr入门 深入了解AWR报告

    天萃荷净 深入了解AWR报告,ASH与AWR报告的官方说明,数据库进程和性能视图获取 1.AWR与ASH概念 1.ASH 若是一个普通的会话(我是指没有大量地耗费资源),则对于性能调整来说无足轻重.但 ...

  6. oracle 创建角色 权限设置,[学习笔记] Oracle创建用户、分配权限、设置角色,

    [学习笔记] Oracle创建用户.分配权限.设置角色, 创建用户 create user student --用户名 identified by "123456" --密码 de ...

  7. oracle rac 环境配置文件,学习笔记:Oracle RAC spfile参数文件配置案例详解

    天萃荷净 rac中的spfile探讨,记录一下Oracle RAC搭建完成后关于spfile参数文件的配置案例,与更改RAC环境中参数文件的方法 今天朋友的的rac,因为被同事做数据库升级,分别在两个 ...

  8. oracle数据变化记录,学习笔记:Oracle伪列函数ora_rowscn 记录表中行数据的修改时间...

    天萃荷净 Oracle数据库开发时使用伪列函数ora_rowscn查询出数据库表中行数据的修改时间 一.默认情况下 –创建t_orascn测试表 SQL> create table t_oras ...

  9. oracle的脚本日志,学习笔记:Oracle alert日志文件巡检脚本

    天萃荷净 分享一篇Oracle alert日志文件巡检脚本 每天都检查oracle日志,所以写了一个比较完善的shell,让其自动处理,在运行程序之前,需要在该脚本目录下新建tmp目录 #!/usr/ ...

最新文章

  1. OpenCV最经典的3种颜色空间(cv2.cvtColor)及互相转换
  2. android中怎么网络判断,Android中判断网络是否连接实例详解
  3. 有重复元素的排列问题pascal题解
  4. object 构造器java_“java”中为什么“Object”类要有一个空的构造函数?
  5. Ubuntu20.04下面运行applet与freemind部署到web上(调研+找到替换方案)
  6. ASP.NET 2.0中实现模板中的数据绑定
  7. spring boot html乱码,Spring-boot 字符集设置 解决乱码方案
  8. hihoCoder 1014trie树(字典树)
  9. 给公司的电脑配置theano
  10. python serial_python_serial
  11. 20190907:(leetcode习题)打家劫舍
  12. Visual Studio 2017在编译OpenCV 4.2.0时出现编译器错误C2001:常量中有换行符
  13. linux进程泄漏如何定位,定位Linux下定位进程被谁KILL
  14. 怎样在计算机上设置纸大小,电脑中打印机设备自定义纸张打印大小的方法
  15. Go语言(Golang)超时机制
  16. Bootstrap3 按钮状态切换
  17. QT美化使用字体图标
  18. DSA签名简介及对其的攻击方式
  19. js实现下载文件流图片
  20. 3 分钟生成一个单元测试报告,这个样式爱了

热门文章

  1. 文献阅读 | Resetting histone modifications during human parental-to-zygotic transition
  2. 计算机专业中国十大名校最新排名,中国最顶尖的十所大学 中国十大名校排名...
  3. TS流格式小白入门解读
  4. 云原生 + 无代码,「DaoCloud 道客」探索无限可能——「DaoCloud 道客」+轻流联合解决方案
  5. 寒假日报(1.25)
  6. 如何理解面向对象(什么是面向对象?)
  7. Android Studio问题解决:Gradle sync failed: Sync failed: reason unknown
  8. 编写可读代码,提高工作效率
  9. 福州大学计算机学院奖学金,2018年福州大学硕士研究生奖学金和助学金政策
  10. 分享几个能在大学赚钱的案例