CBO中SMON进程与col_usage$的维护

从Oracle9i开始,为了监控column的使用信息,引入了一个对象col_usage$,用于记录运行时的COLUMN使用信息。

这部分信息由SMON维护,所以当看到SMON报出相关的死锁、错误时不要惊讶,SMON做的工作是越来越杂了。

在Oracle10g中,这个表的结构如下:

create table col_usage$

(

obj#              number,                                 /* object number */

intcol#           number,                        /* internal column number */

equality_preds    number,                           /* equality predicates */

equijoin_preds    number,                           /* equijoin predicates */

nonequijoin_preds number,                        /* nonequijoin predicates */

range_preds       number,                              /* range predicates */

like_preds        number,                         /* (not) like predicates */

null_preds        number,                         /* (not) null predicates */

timestamp         date      /* timestamp of last time this row was changed */

)

storage (initial 200K next 100k maxextents unlimited pctincrease 0)

/

create unique index i_col_usage$ on col_usage$(obj#,intcol#)

storage (maxextents unlimited)

/

注意,这里的每个选项都是有意义的,比如maxextents unlimited就是因为col_usage$表可能过度扩展空间设计的。

今天,在客户一个繁忙的数据库中,看到了关于这个表的操作SQL,执行次数非常频繁,以下是3个SQL:

LOCK TABLE SYS.col_usage$ IN EXCLUSIVE MODE NOWAIT;

UPDATE SYS.col_usage$

SET equality_preds = equality_preds + DECODE (BITAND (:flag, 1), 0, 0, 1),

equijoin_preds = equijoin_preds + DECODE (BITAND (:flag, 2), 0, 0, 1),

nonequijoin_preds =

nonequijoin_preds + DECODE (BITAND (:flag, 4),

0, 0,

1

),

range_preds = range_preds + DECODE (BITAND (:flag, 8), 0, 0, 1),

like_preds = like_preds + DECODE (BITAND (:flag, 16), 0, 0, 1),

null_preds = null_preds + DECODE (BITAND (:flag, 32), 0, 0, 1),

TIMESTAMP = :TIME

WHERE obj# = :objn AND intcol# = :coln;

INSERT INTO SYS.col_usage$

VALUES (:objn, :coln, DECODE (BITAND (:flag, 1), 0, 0, 1),

DECODE (BITAND (:flag, 2), 0, 0, 1),

DECODE (BITAND (:flag, 4), 0, 0, 1),

DECODE (BITAND (:flag, 8), 0, 0, 1),

DECODE (BITAND (:flag, 16), 0, 0, 1),

DECODE (BITAND (:flag, 32), 0, 0, 1), :TIME);

在以下1小时采样的报告中,3条SQL执行了数千次:

Parse CallsExecutions% Total ParsesSQL IdSQL ModuleSQL Text

9864,0750.713c1kubcdjnppq

update sys.col_usage$ set eq...

986690.7153btfq0dt9bs9

insert into sys.col_usage$ val...

9869860.71b2gnxm5z6r51n

lock table sys.col_usage$ in e...

相关的维护SQL还有:

delete from sys.col_usage$ c where not exists (select 1 from sys.obj$ o where o.obj# = c.obj# )

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

时间: 2024-10-03 14:12:28

CBO中SMON进程与col_usage$的维护的相关文章

Oracle SMON进程的作用

      Oracle SMON进程会将各个表空间的空闲碎片合并在一起,让数据库系统更加容易分配.从而提高数据库的性能.另外,在数据库运行的过程中,会因为断电或者其他的原因而发生故障.此时由于数据高速缓存中的脏缓存块还没有来得及写入到数据文件中,从而导致数据的丢失.在数据库启动的时候,系统监视进程SMON会在下一次启动例程的时候,自动读取重做日志文件并对数据库进行恢复.也就是说,进行将已提交的事物写入数据文件(已经写入到日志文件中而没有写入到数据文件中的数据).回退未提交的事务操作.可见,Or

PHP中实现进程间通讯

进程 PHP中实现进程间通讯 邱文宇   本文将讨论在PHP4环境下如何使用进程间通讯机制--IPC(Inter-Process-Communication).本文讨论的软件环境是linux+php4.0.4或更高版本.首先,我们假设你已经装好了PHP4和UNIX, 为了使得php4可以使用共享内存和信号量,必须在编译php4程序时激活shmop和sysvsem这两个扩展模块. 实现方法:在PHP设定(configure)时加入如下选项. --enable-shmop --enable-sysv

在PHP中实现进程间通讯

本文将讨论在PHP4环境下如何使用进程间通讯机制--IPC(Inter-Process-Communication).本文讨论的软件环境是linux+php4.0.4或更高版本.首先,我们假设你已经装好了PHP4和UNIX, 为了使得php4可以使用共享内存和信号量,必须在编译php4程序时激活shmop和sysvsem这两个扩展模块. 实现方法:在PHP设定(configure)时加入如下选项. --enable-shmop --enable-sysvsem  这样就使得你的PHP系统可以处理

ORACLE中LOB字段的使用和维护

oracle 摘要:本文通过实例介绍了在ORACLE数据库中通过DBMS_LOB包使用和维护LOB数据类型的基本方法. 关键词:ORACLE DBMS_LOB LOB 维护 中图分类号:TP31 1.引言 随着社会的发展,在现代信息系统的开发中,需要存储的已不仅仅是简单的文字信息,同时还包括一些图片和音像资料或者是超长的文本.比如开发一套旅游信息系统,每一个景点都有丰富的图片.音像资料和大量的文字介绍.这就要求后台数据库要有存储这些数据的能力.ORACLE公司在其Oracle8i中通过提供LOB

用快照枚举当前系统中所有进程

如何用快照枚举当前系统中所有进程,近来问这个问题的朋友比较多,所以干脆贴上来算了.呵呵.:D 在窗体上添加一个ListView,设置其ViewStyle为vsReport,在ListView上添加三个Column,再添加一个Button. #include <tlhelp32.h>#include "stdio.h"void __fastcall TMainForm::Button1Click(TObject *Sender){ // Find each process a

Linux系统中的进程管理简介

在Linux系统里,当前正在运行的程序实例称为进程.比如,当你启动Apache的时候,系统会为它分配一个进程ID.然后就可以用这个ID监视和控制这个程序. 进程监视和控制是任何Linux系统管理员的核心任务.一个管理员可以终止("kill").重启一个进程,甚至可以为它指定一个不同的优先级.标准的Linux命令"ps"和"top"通常用于查看当前的进程列表.下面我来说明如何用这些命令和其它命令来管理Linux系统中的进程. 用ps监视进程 一个监

Android中的进程和线程

进程和线程是现代网络操作系统的核心概念.Android作为一种优秀的.承袭Linux的移动操作系统,其进程和线程的概念是开发者和安全工作人员需要深入了解的问题.本文将详细介绍Android中的进程.线程以及相关的技术问题. 进程和线程的基本概念 当一个应用程序开始运行它的第一个组件时,Android会为它启动一个Linux进程,并在其中执行一个单一的线程.默认情况下,应用程序所有的组件均在这个进程的这个线程中运行.然而,你也可以安排组件在其他进程中运行,而且可以为任意进程衍生出其它线程. And

Shell脚本中获取进程ID的方法

 这篇文章主要介绍了Shell脚本中获取进程ID的方法,我想要知道运行中脚本子shell的进程id,我该如何在shell脚本中得到PID,阅读本文即可找到你想要答案,需要的朋友可以参考下     提问: 我想要知道运行中脚本子shell的进程id.我该如何在shell脚本中得到PID. 当我在执行shell脚本时,它会启动一个叫子shell的进程.作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为"批处理进程"). 在某些情况下,你也许想要知道运行中

python实现在windows服务中新建进程的方法

  本文实例讲述了python实现在windows服务中新建进程的方法.分享给大家供大家参考.具体实现方法如下: 需要安装的软件:python和pywin32,我这里装的分别是python-2.6.amd64.pywin32-217.win-amd64-py2.6 文件名:dma_ws.py ? 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 32 33 34 #!python