Oracle 字段监控 ( column monitor)

*/-->

Oracle 字段监控 ( column monitor)

从oracle9i开始,oracle为了监控column的使用情况,引入了col_usage$ 基表,该表会记录
数据库运行期间column作为谓词被使用的情况,这些记录信息会指导oracle如何生成column的
直方图。

这是Oracle 本身原本的意图,从另外一个角度上来讲,我们可以以此为依据,判断哪个字段上
应该建立索引。

1 开启与关闭

Oracle通过隐藏参数"_column_tracking_level"控制此功能的开关:

0
禁用column tracking
1
启用column tracking

此参数可以在session 或者system级别动态调整,不需要重新启动数据库。

2 字段说明

表字段可以通过desc col_usage$来查看。如:

  1. sql> desc col_usage$
Table 1: col_usage$ 字段说明
字段 含义
OBJ# DBA_OBJECTS.OBJECT_ID
INTCOL#  
EQUALITY_PREDS 等值查询
EQUIJOIN_PREDS 等值连接
NONEQUIJOIN_PREDS 不等值连接
RANGE_PREDS 范围查询
LIKE_PREDS 使用LIKE关键字查询
NULL_PREDS 空值查询
TIMESTAMP 时间戳

3 数据来源与清除

  • 插入

    • 自动
      SMON里程每15分钟将SGA中的内容刷新到col_usage$表中
    • 手动
      调用DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO
  • 清除
    在数据库实例关闭的时候,smon会清除无效的行,比如某张表被删除,与此表相关的信息
    即为无效。

4 对直方图的影响

从Oracle 10G 开始,收集表统计信息时,若采用 ”FOR ALL COLUMNS SIZE AUTO"
的方式。如果某张表的字段存在于COL_USAGE$中,数据库就会认为有必要收集直方图信息。

5 对建立索引的影响

开启此功能后,我们可以对字段被用于查询条件的情况进行区分统计。哪个字段被使用到,
被使用的频率有多高,是用于连接还是范围查询等等。这些信息,对于我们创建索引,创
建什么类型的索引,是一个重要的依据。

6 Col_Usage$

6.0.1 表结构

我们先来看看这张表的结构。

  1. create table col_usage$
  2. (
  3. obj# number, /* object number */
  4. intcol# number, /* internal column number */
  5. equality_preds number, /* equality predicates */
  6. equijoin_preds number, /* equijoin predicates */
  7. nonequijoin_preds number, /* nonequijoin predicates */
  8. range_preds number, /* range predicates */
  9. like_preds number, /* (not) like predicates */
  10. null_preds number, /* (not) null predicates */
  11. timestamp date /* timestamp of last time this row was changed */
  12. )
  13. storage (initial 200K next 100k maxextents unlimited pctincrease 0)
  14. /
  15. create unique index i_col_usage$ on col_usage$(obj#,intcol#)
  16. storage (maxextents unlimited)
  17. /

6.0.2 COL_USAGE$字段说明

columen related to
obj# obj$.obj#
intcol# col$.col#
obj# 与基表obj$.obj# 相关联
intcol# 与基表col$.col# 相关联
preds 指的是predicate,也就是where条件语句中的条件。
equlity_preds 赋值条件
equijoin_preds 等值连接
nonequijoin_preds 非等值连接
range_preds 范围查询
like_preds 模糊查询
null_preds 空值匹配查询
timestamp COL_USAGE$ 表中该行数据更新时间

6.0.3 refresh COL_USAGE$(刷新基表)

  1. refresh automatically(自动刷新)

    字段访问记录被保存在SGA中,SMON 会每隔15分钟将这些信息从内存中刷新至基表COL_USAGE$中。SMON进程会对该表进行插入、更新、删除操作。当一个字段被首次访问后,SMON在刷新内存信息时,会在表中插入一行新的数据,如果字段或者表被删除,与其相关的字段信息会被SMON从COL_USAGE$中删除。

  2. refresh manually(手动刷新)

    REFRESH THE TABLE(刷新COL_USAGE$)

    上面已经提及,SMON 进程会每隔15分钟将SGA 中的字段访问数据更新到COL_USAGE$表中。那么如果我们想得到最新的字段访问数据,该怎么办呢?
    Oracle 提供了一个包:DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO.

    1. exec dbms_stats.flush_database_monitoring_info;

6.0.4 利用COL_USAGE$表

在收集表的统计信息时,依据此表决定是否对某个字段收集直方图。我们是否可以利用它呢?
不知道你是否遇到过这种场景:

你负责对优化数据库,其中一个很重要的工作就是创建索引,但是你对业务逻辑和数据库都不
太了解,这时你会怎么做? 如何决定哪个字段应该创建索引?

这种时候,这张表可以给我们提供相应的信息,因为它里面存储了所有字段的访问记录。

  1. col table_owner heading "Tab Owner" for a9
  2. col table_name heading "Table Name" for a30
  3. col column_name heading "Col Name" for a20
  4. col col_acc_num for 9999999
  5. col indexed for a8
  6.  
  7. select u.name as table_owner,
  8. o.name as table_name,
  9. c.name as column_name,
  10. cu.equality_preds + cu.equijoin_preds + cu.nonequijoin_preds +
  11. cu.range_preds + cu.like_preds + cu.null_preds as col_acc_num,
  12. lpad(decode(ic.obj#, null, 'no', 'yes'),5,' ') as indexed,
  13. to_char(round(ratio_to_report(cu.equality_preds + cu.equijoin_preds +
  14. cu.nonequijoin_preds + cu.range_preds +
  15. cu.like_preds + cu.null_preds) over() * 100,
  16. 2),'fm990.00') pct
  17. from sys.col_usage$ cu,
  18. sys.obj$ o,
  19. (select distinct obj#, intcol#, name, property from sys.col$) c,
  20. sys.user$ u,
  21. sys.icol$ ic
  22. where cu.obj# = o.obj#
  23. and cu.intcol# = c.intcol#
  24. and o.obj# = c.obj#
  25. and o.owner# = u.user#
  26. and c.intcol# = ic.intcol#(+)
  27. and c.obj# = ic.bo#(+)
  28. and u.name not in(
  29. 'NONYMOUS','CTXSYS','DIP','DBSNMP','DMSYS','EXFSYS','MDDATA','MDSYS',
  30. 'MGMT_VIEW','OLAPSYS','ORDPLUGINS','ORDSYS','OUTLN','SCOTT','SI_INFORMTN',
  31. '_SCHEMA','SYS','SYSMAN','SYSTEM','WK_TEST','WKPROXY','WKSYS','WMSYS'
  32. ,'XDB','TSMSYS','ORACLE_OCM')
  33. and o.name not like 'BIN$%'
  34. order by 6
  35. /

6.0.5 TEST(测试示例)

  1. create table scott.t_halberd_colmon as select * from dba_objects;
  2.  
  3. SELECT OBJECT_ID,OBJECT_NAME FROM DBA_OBJECTS WHERE OWNER='SCOTT' and object_type='TABLE';
  4.  
  5. EXEC DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
  6.  
  7. select * from col_usage$ where obj#=98581;
  8.  
  9. exec dbms_stats.gather_table_stats(ownname=>'SCOTT',TABNAME=>'T_HALBERD_COLMON',METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO');
  10.  
  11. SELECT table_name, column_name,histogram,num_distinct,num_buckets,sample_size,last_analyzed FROM DBA_TAB_COL_STATISTICS WHERE OWNER='SCOTT';
  12.  
  13. SELECT COUNT(*) FROM SCOTT.T_HALBERD_COLMON WHERE OBJECT_ID < 200;
  14.  
  15. EXEC DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
  16.  
  17. select * from col_usage$ where obj#=98581;
  18.  
  19. SELECT table_name, column_name,histogram,num_distinct,num_buckets,sample_size,last_analyzed FROM DBA_TAB_COL_STATISTICS WHERE OWNER='SCOTT';
  20.  
  21. UPDATE SCOTT.T_HALBERD_COLMON SET OBJECT_ID = MOD(OBJECT_ID,25);
  22.  
  23. EXEC DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
  24.  
  25. select * from col_usage$ where obj#=98581;
  26.  
  27. exec dbms_stats.gather_table_stats(ownname=>'SCOTT',TABNAME=>'T_HALBERD_COLMON',METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO');
  28.  
  29. SELECT table_name, column_name,histogram,num_distinct,num_buckets,sample_size,last_analyzed FROM DBA_TAB_COL_STATISTICS WHERE OWNER='SCOTT';
  30.  
  31. update scott.t1 set object_name=object_id;
  32.  
  33. select count(*) from scott.t1 where object_name like '%4%';
  34.  
  35. EXEC DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
  36.  
  37. select * from col_usage$ where obj#=98581;
  38.  
  39. exec dbms_stats.gather_table_stats(ownname=>'SCOTT',TABNAME=>'T_HALBERD_COLMON',METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO');
  40.  
  41. SELECT table_name, column_name,histogram,num_distinct,num_buckets,sample_size,last_analyzed FROM DBA_TAB_COL_STATISTICS WHERE OWNER='SCOTT';
  42.  
  43. exec dbms_stats.delete_table_stats(ownname=>'SCOTT',TABNAME=>'T_HALBERD_COLMON');
  44.  
  45. SELECT table_name, column_name,histogram,num_distinct,num_buckets,sample_size,last_analyzed FROM DBA_TAB_COL_STATISTICS WHERE OWNER='SCOTT';
  46.  
  47. select * from col_usage$ where obj#=98581;
  48.  
  49. delete from col_usage$ where obj#=98581 and intcol#=1;
  50.  
  51. exec dbms_stats.gather_table_stats(ownname=>'SCOTT',TABNAME=>'T_HALBERD_COLMON',METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO');
  52.  
  53. SELECT table_name, column_name,histogram,num_distinct,num_buckets,sample_size,last_analyzed FROM DBA_TAB_COL_STATISTICS WHERE OWNER='SCOTT';

–如果在col_usgae$不存在对应记录,在size auto模式下是不会生成直方图的

Author: halberd

Created: 2019-06-22 Sat 13:58

Validate

Oracle 字段监控 ( column monitor)的更多相关文章

  1. oracle字段类型

    oracle 字段类型CHAR    固定长度字符串    最大长度2000    bytes              VARCHAR2    可变长度的字符串    最大长度4000    byt ...

  2. Python Oracle数据库监控

    有的时候无法使用Oracle自带的OEM监控,那么就需要确定一个监控方案. 此方案,使用Python+Prometheus+Grafana+Oracle 1.监控配置表 -- Create table ...

  3. 修改有数据oracle字段类型 从number转为varchar

    --修改有数据oracle字段类型 从number转为varchar--例:修改ta_sp_org_invoice表中RESCUE_PHONE字段类型,从number转为varchar --step1 ...

  4. ORACLE索引监控的简单使用

    --ORACLE索引监控的简单使用-------------------------2013/11/20 说明:     应用程序在开发时,可能会建立众多索引,但是这些索引的使用到底怎么样,是否有些索 ...

  5. ORACLE 字段AES算法加密、解密

    ORACLE 字段AES算法加密.解密(解决中文乱码问题)2014年02月12日 17:13:37 华智互联 阅读数:97971.加解密函数入口 CREATE OR REPLACE FUNCTION ...

  6. 采用link方式解决zabbix对于备份监控和ORACLE日志监控由于路径不统一的问题

    #对于备份监控和ORACLE日志监控由于路径不统一,我们可以采用link的方式如:#ln -s 原路径 新路径(/zabbix/logs)#新路径统一放在/zabbix/logs下具体看模板指定. # ...

  7. Oracle字段类型及存储(一)

    Oracle中2000个byte,并不是2000个字符的意思,1个字符在Oracle中可能是1个byte到4个byte不等,需看数据库字符集的设置了. 对GBK字符集而言,ASCII码中128个字符使 ...

  8. Oracle 字段拆分替换在合并成一条

    看了网上很多Oracle字段拆分的实例,但是都未能完全满足要求,或许是我水平不够未能很好的理解,如果有大神懂得并且愿意告知我的,可以私信我,在这里真诚的感谢! 1. 首先建立表并插入测试数据 drop ...

  9. Oracle 字段类型

    Oracle 字段类型 http://www.cnblogs.com/lihan/archive/2010/01/06/1640547.html 字段类型 描述 字段长度及其缺省值 CHAR (siz ...

随机推荐

  1. 并发编程J.U.C之AQS剖析

    一.j.u.c简介 在说主题AQS之前,我们有必要先来说一下J.U.C 顾名思义J.U.C就是java.util.concurrent,java并发工具包.由我们的并发大师老爷子Doug Lea亲自操 ...

  2. servlel出现404问题★ 出现不自动映射 设置XML的问题时候

    ★ 出现不自动映射 设置XML的问题时候 可能是 web.xml配置可能是复制的  错误原因来自于name的匹配 <display-name>webdemo1</display-na ...

  3. STM32 stm32fxxx_flash.icf文件的作用详解

    文章转载自:https://blog.csdn.net/weibo1230123/article/details/80142210 每个芯片开发商都会针对每款芯片来编写一个.icf文件就是传说中的链接 ...

  4. ULPFEC在WebRTC中的实现[转载]

    一.WebRTC对抗网络丢包的两种手段     丢包重传(NACK)和前向纠错(FEC).FEC是一种前向纠错技术,发送端将负载数据加上一定的冗余纠错码一起发送,接收端根据接收到的纠错码对数据进行差错 ...

  5. windows安装PostgreSQL

    犹豫了一小下,初学不在linux下安装sql,虽然说书上有,还是想记录一下,以后好找 入门的书籍是SQL基础教程第二版,图书馆搜刮来的,毕竟要还 下载页面 http://www.enterprised ...

  6. x86和x64下指针的大小

    根据测试 int main() { ; )); )); int n1 = sizeof(a); int n2 = sizeof(p); // int n3 = sizeof(*p); error in ...

  7. 集成 jpush

    给 iOS 应用添加推送功能是一件比较麻烦的事情,本篇文章收集了集成 jpush-react-native 的常见问题,目的是为了帮助用户更好地排查问题 1. 收不到推送 确保是在真机上测试,而不是在 ...

  8. pycharm中报错:ImportError: No module named 'skimage'

    pycharm中直接setting是没办法成功的,会提示is requied C++ bool.....先进入那个页面安装好需要的tools,这个安装比较慢:http://landinghub.vis ...

  9. Linux - TCP/IP网络协议基础

    1.0 Tcp / IP 背景介绍 上世纪70年代,随着计算机的发展,人们意识到如果想要发挥计算机的更大作用,就要讲世界各地的计算机连接起来. 但是简单的连接时不够的,因为计算机之间无法沟通.因此设计 ...

  10. java常用检验接口control方式

    @Controller public class ItemController { @Autowired private ItemService itemService; @RequestMappin ...