讨论几种数据列Column的特性(上)
之前笔者写过一个系列《索引列的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?
2、unused 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的特性(上)的更多相关文章
- 9.5 翻译系列:数据注解之ForeignKey特性【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/foreignkey-dataannotations-attribute-in-code ...
- SQL SERVER几种数据迁移/导出导入的实践
SQLServer提供了多种数据导出导入的工具和方法,在此,分享我实践的经验(只涉及数据库与Excel.数据库与文本文件.数据库与数据库之间的导出导入). (一)数据库与Excel 方法1: 使用数据 ...
- Excel应该这么玩——5、三种数据:Excel也是系统
Excel最常用的功能就是记录数据,把数据按照行列记录下来.这部分数据是源数据,是业务活动中最原始的流水账,作为后续操作的依据.为了从源数据中得出一定的结论,需要对源数据进行分析得出报表数据. ...
- iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】
在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...
- JQuery EasyUI之DataGrid列名和数据列分别设置不同对齐方式(转)
需求如下 现有数据列三列 Name,Age,CreateDate 数据 张三,18,2000-12-09 :12:34:56 李四,28,2000-12-09 :12:34:56 王麻子,38,200 ...
- 四种数据持久化方式(下) :SQLite3 和 Core Data
在上文,我们介绍了iOS开发中的其中2种数据持久化方式:属性列表.归档解档. 本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运用: 在本节,将通过对4个文 ...
- SQLServer修改数据列
修改数据列 在开发和生产过程中,列名的拼写错误或者列名的更改是需要操作数据表的,大多数情况下都是不需要修改的. 以下几种情况下我们并不能直接修改数据列: 1.用于索引的列. 2.用于 CHECK.FO ...
- 9.6 翻译系列:数据注解之Index特性【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/entityframework6/index-attribute-in-code-first.aspx EF ...
- mysql数据库导出模型到powerdesigner,PDM图形窗口中显示数据列的中文注释
1,mysql数据库导出模型到powerdesigner 2,CRL+Shift+X 3,复制以下内容,执行 '******************************************** ...
随机推荐
- 异或+构造 HDOJ 5416 CRB and Tree
题目传送门 题意:给一棵树,问f (u, v) 意思是u到v的所有路径的边权值的异或和,问f (u, v) == s 的u,v有几对 异或+构造:首先计算f (1, u) 的值,那么f (u, v) ...
- 尺取法 POJ 3601 Subsequence
题目传送门 /* 题意:求连续子序列的和不小于s的长度的最小值 尺取法:对数组保存一组下标(起点,终点),使用两端点得到答案 1. 记录前i项的总和,求[i, p)长度的最小值,用二分找到sum[p] ...
- Service官方教程(6)Bound Services主要用来实现通信服务,以及3种实现通信的方案简介。
1.Bound Services A bound service is the server in a client-server interface. A bound service allows ...
- jmeter(三)参数传递
[一]参数化 录制脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统. 这个时候就需要对用户名和密码进行参数化,使每个虚拟用户都使用不 ...
- AJPFX实践 java实现快速排序算法
快速排序算法使用的分治法策略来把一个序列分为两个子序列来实现排序的思路: 1.从数列中挑出一个元素,称为“基准“2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面 ...
- Oracle 表-初步涉水不深(第一天)
oracle 关系型数据库 注释:面对大型数据处理,市场占有率40%多(但是目前正往分布式转换) 故事:本来一台大型计算机才能处理的数据,美国科学家用100台家用电脑连接,成功处理了数据.. tabl ...
- 6月份最新语言排行:Java,Python我更看好谁?
文章首发于终端研发部,转载,请标明原文链接 今天的主题是:探讨一下6月份语言排行还有我的最新展望! 最近,编程语言排行榜前几天发布更新了,在最新的TIOBE编程语言排行榜中,Java依旧位居第一,但前 ...
- 前端:常见的6种HTML5错误用法
一.不要使用section作为div的替代品 人们在标签使用中最常见到的错误之一就是随意将HTML5的<section>等价于<div>——具体地说,就是直接用作替代品(用于样 ...
- Rxjava2的学习与总结
博客地址:https://luhaoaimama1.github.io/2017/07/31/rxjava/
- shiro 通过jdbc连接数据库
本文介绍shiro通过jdbc连接数据库,连接池采用阿里巴巴的druid的连接池 参考文档:https://www.w3cschool.cn/shiro/xgj31if4.html https://w ...