当前位置: 首页 > news >正文

Find INTCOL#=1001 in col_usage$?

在 <了解你所不知道的SMON功能(四):维护col_usage$字典基表>中我介绍了SMON后台进程维护字典基表COL_USAGE$一些细节,有网友阅读了这篇文档后发现其数据库的COL_USAGE$中存在INTCOL#=1001的记录。 INTCOL#列表示internal column number对应于COL$基表的INTCOL#,注意Internal Column Number与COL#(column number as created)是不同的。$ORACLE_HOME/rdbms/admin/sql.bsq对于INTCOL#给出了解释:
* If a table T(c1, addr, c2) contains an ADT column addr which is stored
   * exploded, the table will be internally stored as
   *              T(c1, addr, C0003$, C0004$, C0005$, c2)
   * Of these, only c1, addr and c2 are user visible columns. Thus, the
   * user visible column numbers for (c1, addr, C0003$, C0004$, C0005$, c2)
   * will be 1,2,0,0,0,3. And the corresponding internal column numbers will
   * be 1,2,3,4,5,6.
   *
   * Some dictionary tables like icol$, ccol$ need to contain intcol# so
   * that we can have indexes and constraints on ADT attributes. Also, these
   * tables also need to contain col# to maintain backward compatibility.
   * Most of these tables will need to be accessed by col#, intcol# so
   * indexes are created on them based on (obj#, col#) and (obj#, intcol#).
   * Indexes based on col# have to be non-unique if ADT attributes might
   * appear in the table. Indexes based on intcol# can be unique.
这里的ADT指的是抽象数据类型(Abstract DataType is a user defined data type),例如:
CREATE OR REPLACE TYPE persons_address AS OBJECT (
  streetNumber NUMBER,
  streetName   VARCHAR2(30),
  citySuburb   VARCHAR2(30),
  state        VARCHAR2(4),
  postCode     NUMBER
);
熟读Oracle官方文档的朋友一定会记得,Oracle中单表的column总数存在一个上限:1000,即单表不能拥有超过1000个列。 但令人疑惑的是INTCOL#居然是1001,显然1001是某种magic number,而不是指第1001列。 搞清楚这个问题后,再进一步探索就不难发现问题的关键了:
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production

SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------
www.oracledatabase12g.com

SQL> drop table maclean;

Table dropped.

SQL> create table maclean(oppo_find_me int);

Table created.

SQL> select object_id from dba_objects where object_name='MACLEAN';

 OBJECT_ID
----------
   1343832

SQL> select intcol# from col_usage$ where obj#=1343832;

no rows selected

SQL> insert into maclean values(1);

1 row created.

SQL> commit;

Commit complete.

SQL> select rowid from maclean;    

ROWID
------------------
AAFIFYAABAAByPKAAA

SQL> delete maclean where rowid='AAFIFYAABAAByPKAAA';

1 row deleted.

SQL> commit;

Commit complete.

SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;

PL/SQL procedure successfully completed.

SQL> select intcol#,equality_preds from col_usage$ where obj#=1343832;

   INTCOL# EQUALITY_PREDS
---------- --------------
      1001              1

通过这一点可以了解那些字典基表是以rowid为条件来查询或更新的

SQL> select owner || '.' || object_name
  2    from dba_objects
  3   where object_id in (select obj# from col_usage$ where intcol# = 1001);

OWNER||'.'||OBJECT_NAME
--------------------------------------------------------------------------------
SYS.COL$
SYS.CDEF$
SYS.VIEW$
SYS.SUMPARTLOG$
SYS.SUM$
SYS.SUMKEY$
SYS.SUMAGG$
SYS.SUMPRED$
SYS.SUMQB$
SYS.PS$
SYS.AW_OBJ$

OWNER||'.'||OBJECT_NAME
--------------------------------------------------------------------------------
SYS.AW_PROP$
SYS.WRI$_ADV_OBJECTS
WMSYS.WM$WORKSPACES_TABLE
SYS.MACLEAN
CTXSYS.DR$INDEX
XDB.XDB$H_INDEX
XDB.XDB$RESOURCE
EXFSYS.RLM$SCHACTLIST
SYS.AW$EXPRESS
MACLEAN.SAMPLE
总结: Oracle最早在9i中引入了col_usage$字典基表,其目的在于监控column在SQL语句作为predicate的情况,col_usage$的出现完善了CBO中柱状图自动收集的机制。该字典基表上的INTCOL#列代表Internal Column Number以标识ADT列。 INTCOL#等于1001代表ROWID伪列,也就是相关对象曾使用ROWID充当predicate。

相关文章:

  • 比特币的矿工为什么讨厌开发组Core?
  • 有哪些功能是DBMS_STATS无法实现而Analyze命令可以做到的?
  • Kafka 1.1新功能:数据的路径间迁移
  • Toast 学习
  • AutoCAD 命令统计魔幻球的实现过程--(3)
  • SeimiCrawler 2.0版本变动介绍
  • DNS服务的配置与管理(5) 配置转发器
  • 基于注解实现SpringBoot多数据源配置
  • shell if 参数
  • 换个角度看问题
  • Lr(3)-脚本调试之“参数化、检查点”
  • 添加删除mysql用户
  • dp学习笔记1
  • AT&T以11亿美元的价格将数据中心出售给Brookfield
  • mysql开启常规日志
  • AHK 中 = 和 == 等比较运算符的用法
  • k8s 面向应用开发者的基础命令
  • PHP CLI应用的调试原理
  • 初识MongoDB分片
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于Flux,Vuex,Redux的思考
  • 官方解决所有 npm 全局安装权限问题
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 看域名解析域名安全对SEO的影响
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 时间复杂度与空间复杂度分析
  • 事件委托的小应用
  • 原生js练习题---第五课
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 在Unity中实现一个简单的消息管理器
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​渐进式Web应用PWA的未来
  • #pragam once 和 #ifndef 预编译头
  • (6)添加vue-cookie
  • (9)目标检测_SSD的原理
  • (转)创业家杂志:UCWEB天使第一步
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • @软考考生,这份软考高分攻略你须知道
  • []Telit UC864E 拨号上网
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [BZOJ 3680]吊打XXX(模拟退火)
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [EFI]英特尔 冥王峡谷 NUC8i7HVK 电脑 Hackintosh 黑苹果efi引导文件
  • [ffmpeg] 定制滤波器
  • [FFmpeg学习]从视频中获取图片
  • [Go WebSocket] 多房间的聊天室(三)自动清理无人房间
  • [IE编程] 如何设置IE8的WebBrowser控件(MSHTML) 的渲染模式
  • [Java]快速入门优先队列(堆)手撕相关面试题