[20111215]sys.col_usage$和intcol# = 1001的问题.txt

[20111215]sys.col_usage$和intcol# = 1001的问题.txt

讨论链接:http://www.itpub.net/thread-1454515-1-1.html

col_usage$字典基表,其目的在于监控column在SQL语句作为predicate的情况,col_usage$的出现完善了CBO中柱状图自动收集的机制。

SMON会每15分钟将shared pool中的predicate columns的数据刷新到col_usage$基表中(until periodically about every 15 minutes SMON flush the data into the data dictionary),另外当instance shutdown时SMON会扫描col_usage$并找出已被drop表的相关predicate columns记录,并删除这部分”orphaned”孤儿记录。手动可以使用exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO()刷新.

SQL> SELECT *  FROM SYS.col_usage$ WHERE intcol# >= 1001;

      OBJ#    INTCOL# EQUALITY_PREDS EQUIJOIN_PREDS NONEQUIJOIN_PREDS RANGE_PREDS LIKE_PREDS NULL_PREDS TIMESTAMP
---------- ---------- -------------- -------------- ----------------- ----------- ---------- ---------- -------------------
     13036       1001              1              0                 0           0          0          0 2009-08-15 00:25:25
     55847       1001              6              0                 0           0          0          0 2011-09-23 11:57:00
     56506       1001              8              0                 0           0          0          0 2011-11-15 10:45:00
     57114       1001              0              1                 0           0          0          0 2009-08-15 00:33:36
     58047       1001              1              0                 0           0          0          0 2009-08-15 00:33:36

intcol#表示表中字段的列。

而我查询对应的表根本不可能存在这么大的column, 而SYS.col_usage$中记录的

1.建立测试脚本:

建立一个shell,形成一个1001字段的表的建立脚本。
$ cat cr_column_1001.sh

#! /bin/bash
echo "create table t3 ("
for (( i = 1; i do
    echo "c$i varchar2(1),"
done
echo "c$i varchar2(1)"
echo ");"

SQL> @aaa
c1001 varchar2(1)
*
ERROR at line 1002:
ORA-01792: maximum number of columns in a table or view is 1000

提示很明显,不能建立的字段超过1000.修改以上脚本,建立1000个字段的表。建立成功!但是如果这时要建立一个函数索引,命令如下:

SQL> create index if_t3_a on t3(upper(c1));
create index if_t3_a on t3(upper(c1))
                                 *
ERROR at line 1:
ORA-01792: maximum number of columns in a table or view is 1000

可以发现,提示依旧不能建立函数索引,主要问题是建立的一个函数索引相当于建立一个虚拟列,这样已经超出了1000个字段的限制。

那么intcol# >= 1001;表示什么呢?

很简单就是表的rowid。例子如下:

SQL> SELECT * FROM SYS.col_usage$ WHERE obj# IN (SELECT object_id FROM dba_objects WHERE wner = 'SCOTT' AND object_name = 'DEPT');

      OBJ#    INTCOL# EQUALITY_PREDS EQUIJOIN_PREDS NONEQUIJOIN_PREDS RANGE_PREDS LIKE_PREDS NULL_PREDS TIMESTAMP
---------- ---------- -------------- -------------- ----------------- ----------- ---------- ---------- -------------------
     73199          1             10              2                 0           0          0          0 2011-12-13 11:44:28

很简单我以前做过deptno=:b 的查询。

如果我执行
select * from dept where dname='SALES';

    DEPTNO DNAME          LOC
---------- -------------- -------------
        30 SALES          CHICAGO

刷新SYS.col_usage$表,手动执行exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO()[如果不刷新,也许要等15分钟]。

SQL> SELECT * FROM SYS.col_usage$ WHERE obj# IN (SELECT object_id FROM dba_objects WHERE wner = 'SCOTT' AND object_name = 'DEPT');

      OBJ#    INTCOL# EQUALITY_PREDS EQUIJOIN_PREDS NONEQUIJOIN_PREDS RANGE_PREDS LIKE_PREDS NULL_PREDS TIMESTAMP
---------- ---------- -------------- -------------- ----------------- ----------- ---------- ---------- -------------------
     73199          1             10              2                 0           0          0          0 2011-12-13 11:44:28
     73199          2              1              0                 0           0          0          0 2011-12-15 09:31:04

可以发现dname已经出现在SYS.col_usage$视图中。

SQL> select * from dept where rowid='AAAR3vAAEAAAACHAAC';

    DEPTNO DNAME          LOC
---------- -------------- -------------
        30 SALES          CHICAGO

SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO();

SQL> SELECT * FROM SYS.col_usage$ WHERE obj# IN (SELECT object_id FROM dba_objects WHERE wner = 'SCOTT' AND object_name = 'DEPT');

      OBJ#    INTCOL# EQUALITY_PREDS EQUIJOIN_PREDS NONEQUIJOIN_PREDS RANGE_PREDS LIKE_PREDS NULL_PREDS TIMESTAMP
---------- ---------- -------------- -------------- ----------------- ----------- ---------- ---------- -------------------
     73199          1             10              2                 0           0          0          0 2011-12-13 11:44:28
     73199          2              1              0                 0           0          0          0 2011-12-15 09:31:04
     73199       1001              1              0                 0           0          0          0 2011-12-15 09:33:29

intcol#=1001出现,说明1001表示rowid伪列。

时间: 2024-09-20 19:44:33

[20111215]sys.col_usage$和intcol# = 1001的问题.txt的相关文章

[20131110]sys用户的表不能建立触发器.txt

[20131110]sys用户的表不能建立触发器.txt SYS@test01p> @ver BANNER                                                                               CON_ID -------------------------------------------------------------------------------- ---------- Oracle Database 12c

[20160704]从跟踪文件抽取sql语句.txt

[20160704]从跟踪文件抽取sql语句.txt --以前写过两篇,链接如下: http://blog.itpub.net/267265/viewspace-775398/ http://blog.itpub.net/267265/viewspace-748041/ 1个利用tkprof的recodr参数,可以记录跟踪整个sql语句序列,缺点就是丢失一些递归的sql语句.另外一个利用awk脚本抽取sql语句. 今天再写一个简单一点的脚本: 1.环境: SCOTT@book> @ &r/v

alter table新增字段操作究竟有何影响?(上篇)

很久以前就有个疑问,见过一些表设计时会留出几个reverse的字段,目的是为了以后扩展,但此时设计的字段类型.长度等都是预计的,未来是否可用,不好说,那为什么会这么做呢?可能的原因是:"我现在设定好字段,需要的时候直接用就行了,不需要新增字段的操作". 那么,问题就是,新增字段的操作究竟有什么影响?增加表字段的时候,是否会锁表?对DML.DDL有什么影响?如果搞清楚这些,才能对上面的问题给出科学的答案. 为了证明增加字段的操作究竟做了什么,有什么影响,打算使用10046事件来看看. S

SMON功能介绍 2

原文转自:http://www.askmaclean.com/archives/smon-clean-up-obj-table.html 了解你所不知道的SMON功能(三):清理obj$基表 SMON的作用还包括清理obj$数据字典基表(cleanup obj$) OBJ$字典基表是Oracle Bootstarp启动自举的重要对象之一: SQL> set linesize 80 ; SQL> select sql_text from bootstrap$ where sql_text lik

公司软件部VB组代码撰写暂行约定 probezy(转贴)

公司软件部VB组代码撰写暂行约定    probezy(转贴)   出处     http://www.vbprobe.com    一.变量和对象     程序中的变量遵循匈牙利表示法,即"前缀+变量含义",变量的含义为一个或多个英文单词,每个单词的第一个字母大写,不要用汉语拼音代替.变量前缀为三个小写字母示意其类型,所需添加的前缀遵循微软在MSDN中的建议.列表如下:     基本数据类型 变量类型  前缀  示例 Boolean  bln  blnFound Byte  byt 

VB编程的8个小技巧

编程|技巧 1."&"替换"+"在很多人的编程语言中,用"+"来连接字符串,这样容易导致歧义.良好的习惯是用"&"来连接字符串. 不正确: Dim sMessage As StringsMessage = "1" + "2" 正确: Dim sMessage As StringsMessage = "1" & "2" 注意:

python多线程批量远程管理程序

python多线程批量远程管理程序 #!/usr/bin/env python # this script comes from beijing oldboy trainning. # e_mail:70271111@qq.com # function: remote multi exec cmd by ssh. # version:1.1 ################################################ # oldboy trainning info. # QQ

如何在CDH5上运行Spark应用

这篇文章参考 How-to: Run a Simple Apache Spark App in CDH 5 编写而成,没有完全参照原文翻译,而是重新进行了整理,例如:spark 版本改为 1.3.0,添加了 Python 版的程序. 创建 maven 工程 使用下面命令创建一个普通的 maven 工程: $ mvn archetype:generate -DgroupId=com.cloudera.sparkwordcount -DartifactId=sparkwordcount -Darch

详解python的几种标准输出重定向方式_python

一. 背景 在Python中,文件对象sys.stdin.sys.stdout和sys.stderr分别对应解释器的标准输入.标准输出和标准出错流.在程序启动时,这些对象的初值由sys.__stdin__.sys.__stdout__和sys.__stderr__保存,以便用于收尾(finalization)时恢复标准流对象. Windows系统中IDLE(Python GUI)由pythonw.exe,该GUI没有控制台.因此,IDLE将标准输出句柄替换为特殊的PseudoOutputFile