之前笔者写过一个系列《索引列的usable和visible》(http://space.itpub.net/17203031/viewspace-688135),详细讨论了索引列的usable和visible属性。在11g中,Oracle推出了索引的visible和invisible属性,用于临时性的屏蔽索引参与优化器过程。

在本篇中,我们对应讨论一下column的一些属性,权作为之前系列的续篇。

1、环境介绍

我们选择Oracle 11gR2进行试验。

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE       11.2.0.1.0        Production

在数据字典dba_tab_cols中,有两个数据列HIDDEN_COLUMN和VIRTUAL_COLUMN。本篇主要围绕两个属性进行研究。

SQL> desc dba_tab_cols;

Name                Type          Nullable Default Comments

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

OWNER               VARCHAR2(30)

TABLE_NAME          VARCHAR2(30)                   Table, view or cluster name

(篇幅原因,有省略……)

HIDDEN_COLUMN       VARCHAR2(3)   Y               Is this a hidden column?

VIRTUAL_COLUMN      VARCHAR2(3)   Y               Is this a virtual column?

2unused column

Unused Column是Oracle为了支持快速数据列Column删除提供的一种功能。我们可以通过设置数据列unused的状态,很快地(7×24系统情况下)将数据表的某些列屏蔽组。这个过程中不消耗很多的资源和引起大量的阻塞。

Sys用户下有一个数据表T,包括数据列seq_num。我们可以通过set unusable <column>来将数据列设置为unused。

SQL> show user;

User is"SYS"

SQL> alter table t set unused column seq_num;

alter table t set unused column seq_num

ORA-12988:无法删除属于SYS的表中的列

Sys用户下的数据表是不能对column进行unused操作的。我们切换到scott用户下,创建数据表t。

SQL> conn scott/tiger@wilson;

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

Connected as scott

SQL> create table t as selectobject_id, owner, object_name, last_ddl_timefrom dba_objects;

Table created

SQL> select count(*) from t;

COUNT(*)

----------

72779

SQL> exec dbms_stats.gather_table_stats(user,'T',cascade => true);

PL/SQL procedure successfully completed

此时,数据字典中正常数据列信息如下。

SQL> select column_name, HIDDEN_COLUMN, VIRTUAL_COLUMN, SEGMENT_COLUMN_ID from dba_tab_cols where wner='SCOTT' and table_name='T';

COLUMN_NAME          HIDDEN_COLUMN VIRTUAL_COLUMN SEGMENT_COLUMN_ID

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

OBJECT_ID               NO           NO                            1

OWNER                  NO           NO                            2

OBJECT_NAME            NO           NO                            3

LAST_DDL_TIME           NO           NO                            4

此时,四个数据列都是正常的。使用set unusable属性。

SQL> alter table t set unused column owner;

Table altered

SQL> select column_name, HIDDEN_COLUMN, VIRTUAL_COLUMN, SEGMENT_COLUMN_ID from dba_tab_cols where wner='SCOTT' and table_name='T';

COLUMN_NAME                   HIDDEN_COLUMN VIRTUAL_COLUMN SEGMENT_COLUMN_ID

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

OBJECT_ID                     NO           NO                            1

SYS_C00002_13080423:42:23$    YES          NO                            2

OBJECT_NAME                   NO           NO                            3

LAST_DDL_TIME                 NO           NO                            4

对owner列进行unused处理之后,我们发现数据字典中,原有的字段被修改为一个系统内部名称“SYS_C00002_13080423:42:23$”。字段的hindden_column取值为Yes,说明不再显示出来。

注意:对一个字段进行unused属性设置,是一个标记性的动作。对应的数据表段结构没有进行收缩动作,对应的空间也不会回收。重要的是,对一个字段进行unused处理过程持续时间很短,远低于drop一个数据大表数据列的过程。

而且,修改的列名中,有很强烈的时间信息,也就反映了进行操作的时间点。

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YYYY-MM-DDHH2

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

2013-08-04 23:52:26

被设置为unused之后,字段就不会出现在select *和desc列表中,Oracle原则上也不会承认这个字段了。

SQL> desc t;

Name         Type         Nullable Default Comments

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

OBJECT_ID    NUMBER       Y

OBJECT_NAME  VARCHAR2(128) Y

LAST_DDL_TIME DATE         Y

SQL> col object_name for a10;

SQL> select * from t where rownum<5;

OBJECT_ID OBJECT_NAM LAST_DDL_TIME

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

20 ICOL$     13-八月-09 23

46 I_USER1   13-八月-09 23

28 CON$      13-八月-09 23

15 UNDO$     13-八月-09 23

SQL> insert into t (owner) values ('kk');

insert into t (owner) values ('kk')

ORA-00904: "OWNER":标识符无效

注意,在Oracle Index里面,如果一个索引状态是unusable了,表示该索引需要重建rebuild操作。但是数据字段如果unused,目前是没有方法将其逆转过来的。

SQL> alter table t set used column owner;

alter table t set used column owner

ORA-02000:缺失UNUSED关键字

设置成unused的column信息理论上还存在在数据段segment结构里面。我们可以选择一个“合适”的时间进行删除。

SQL> alter table tdrop unused columns;

(持续时间长)

Table altered

SQL> desc t;

Name         Type         Nullable Default Comments

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

OBJECT_ID    NUMBER       Y

OBJECT_NAME  VARCHAR2(128) Y

LAST_DDL_TIME DATE         Y

SQL> select column_name, HIDDEN_COLUMN, VIRTUAL_COLUMN, SEGMENT_COLUMN_ID from dba_tab_cols where wner='SCOTT' and table_name='T';

COLUMN_NAME                   HIDDEN_COLUMN VIRTUAL_COLUMN SEGMENT_COLUMN_ID

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

OBJECT_ID                     NO           NO                            1

OBJECT_NAME                   NO           NO                            2

LAST_DDL_TIME                 NO           NO                            3

Drop unused columns可以一次性的将数据表上面所有的unused列删除掉。这个过程是真正进行的删除,如果数据表比较大的话,这个操作持续时间还是比较长的。

最后我们聊聊unused column的实际意义。应该说,这个功能对于开发阶段而言,没有任何意义。对于投产上线过程和升级过程的DBA运维工作,有一定作用。

在进行投产上线的时候,比如系统新版本需要删除某些大表的字段。如果系统是7×24小时运行,投产上线阶段给定的时间窗口不够,直接删除字段引起的阻塞风险和时间成本可能是运维单位不能承受的。Unused column提供了一种可能,就是快速的将数据表字段屏蔽住,减少这种阻塞时间。段级别的删除,可以调整到系统正式的维护窗口中一点点的去完成。

下面我们会继续讨论几种column特性。

http://space.itpub.net/?uid-17203031-action-viewspace-itemid-767825

讨论几种数据列Column的特性(上)的更多相关文章

  1. 9.5 翻译系列:数据注解之ForeignKey特性【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/foreignkey-dataannotations-attribute-in-code ...

  2. SQL SERVER几种数据迁移/导出导入的实践

    SQLServer提供了多种数据导出导入的工具和方法,在此,分享我实践的经验(只涉及数据库与Excel.数据库与文本文件.数据库与数据库之间的导出导入). (一)数据库与Excel 方法1: 使用数据 ...

  3. Excel应该这么玩——5、三种数据:Excel也是系统

        Excel最常用的功能就是记录数据,把数据按照行列记录下来.这部分数据是源数据,是业务活动中最原始的流水账,作为后续操作的依据.为了从源数据中得出一定的结论,需要对源数据进行分析得出报表数据. ...

  4. iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

                   在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...

  5. JQuery EasyUI之DataGrid列名和数据列分别设置不同对齐方式(转)

    需求如下 现有数据列三列 Name,Age,CreateDate 数据 张三,18,2000-12-09 :12:34:56 李四,28,2000-12-09 :12:34:56 王麻子,38,200 ...

  6. 四种数据持久化方式(下) :SQLite3 和 Core Data

    在上文,我们介绍了iOS开发中的其中2种数据持久化方式:属性列表.归档解档. 本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运用: 在本节,将通过对4个文 ...

  7. SQLServer修改数据列

    修改数据列 在开发和生产过程中,列名的拼写错误或者列名的更改是需要操作数据表的,大多数情况下都是不需要修改的. 以下几种情况下我们并不能直接修改数据列: 1.用于索引的列. 2.用于 CHECK.FO ...

  8. 9.6 翻译系列:数据注解之Index特性【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/entityframework6/index-attribute-in-code-first.aspx EF ...

  9. mysql数据库导出模型到powerdesigner,PDM图形窗口中显示数据列的中文注释

    1,mysql数据库导出模型到powerdesigner 2,CRL+Shift+X 3,复制以下内容,执行 '******************************************** ...

随机推荐

  1. 总结用CoreText绘制文本时遇到的问题以及解决办法

    关于CoreText不做解释.用的人自然知道这个是干什么的. 功能非常强大,可以绘制文本,图片等. 这次用的Xcode7.0的版本.所以之前很多方法,现在不能用.也不是不能用,就是有黄色警告很不爽. ...

  2. 转 Docker 组件如何协作?- 每天5分钟玩转容器技术(8)

    http://www.cnblogs.com/CloudMan6/p/6774519.html 记得我们运行的第一个容器吗?现在通过它来体会一下 Docker 各个组件是如何协作的. 容器启动过程如下 ...

  3. maven 工程导入jar包

    Maven项目引入jar包的方法,希望能帮助有需要的朋友们 法一.手动导入:项目右键—>Build Path—>Configure Build Path—>选中Libraries—& ...

  4. React Native for Android 学习

    前言 Facebook 在2015.9.15发布了 React Native for Android,把 JavaScript 开发技术扩展到了移动Android平台.基于React的React Na ...

  5. mysql 中 时间函数 now() current_timestamp() 和 sysdate() 比较

    转载请注明出处 https://www.cnblogs.com/majianming/p/9647786.html 在mysql中有三个时间函数用来获取当前的时间,分别是now().current_t ...

  6. 2017广东工业大学程序设计竞赛决赛 H tmk买礼物

    题意: Description 今天是校赛的日子,为了庆祝这么喜庆的日子,TMK打算买些礼物给女票LSH庆祝一下. TMK进入了雪梨超市,然后刚踏入的一瞬间,店主就对TMK说:“恭喜你成为了本店第21 ...

  7. Elasticsearch--集群管理_再平衡&预热

    目录 控制集群的再平衡 再平衡 集群的就绪 集群再平衡设置 控制再平衡何时开始 控制同时在节点移动的分片数量 控制单个节点上同时初始化的分片数量 控制单个节点上同时初始化的主分片数量 控制分配的分片类 ...

  8. 怎么学好XXX

    怎么学好数据库是一个比较大题目,数据库不仅仅是写SQL那么简单,即使知道了SQL怎么写,还需要很清楚的知道这条SQL他大概扫描了多少数据,返回多少数据,是否需要创建索引.至于SQL优化是一个比较专业的 ...

  9. leetcode_Counting Bits_dp

    给定num,用O(num)的时间复杂度计算0--num中所有数的二进制表示中1的个数. vector<int> countBits(int num) { vector<,); ;i& ...

  10. CAD参数绘制圆弧(com接口)

    在CAD设计时,需要绘制圆弧,用户可以在图面点圆弧起点,圆弧上的一点和圆弧的终点,这样就绘制出圆弧. 主要用到函数说明: _DMxDrawX::DrawArc2 由圆弧上的三点绘制一个圆弧.详细说明如 ...