楼主: 幻雪青枫

3亿条数据的一个表插入新字段,并赋予默认值,如何做

[复制链接]
求职 : 数据库管理员
论坛徽章:
10
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-27 06:00:12ITPUB社区千里马徽章
日期:2013-06-09 10:15:342013年新春福章
日期:2013-02-25 14:51:24奥运纪念徽章
日期:2012-11-28 09:33:31奥运纪念徽章
日期:2012-11-20 10:27:31ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42马上有对象
日期:2014-02-18 16:44:08
31#
发表于 2012-2-27 20:23 | 只看该作者
Lemontree-mxh 发表于 2012-2-26 10:15
这个需求很常见了, 主要是alter table 过程中会有表级别的排他锁。  在这个级别即使select 都不行。
为了 ...

alter table只会为表ddl锁和dml的TM锁,此时别的session无法ddl和dml操作,oracle中是不会阻塞select查询的,除了分布式事务。
推荐用oracle 9I的在线重定义来实现,仅仅只在结束同步时锁表。

使用道具 举报

回复
论坛徽章:
1
2012新春纪念徽章
日期:2012-01-04 11:58:44
32#
 楼主| 发表于 2012-2-27 20:26 | 只看该作者
其实我写错了,今天看了一下历史库,16颗CPU呢,我以为P4的单cpu呢,可能跟自己玩的测试机记混了

使用道具 举报

回复
论坛徽章:
1
奥运会纪念徽章:举重
日期:2012-06-20 21:55:30
33#
发表于 2012-2-28 19:00 | 只看该作者
dotaddjj 发表于 2012-2-27 20:23
alter table只会为表ddl锁和dml的TM锁,此时别的session无法ddl和dml操作,oracle中是不会阻塞select查询 ...

你可以再测试一下。

使用道具 举报

回复
论坛徽章:
1
奥运会纪念徽章:举重
日期:2012-06-20 21:55:30
34#
发表于 2012-2-28 19:21 | 只看该作者
dotaddjj 发表于 2012-2-27 20:23
alter table只会为表ddl锁和dml的TM锁,此时别的session无法ddl和dml操作,oracle中是不会阻塞select查询 ...

Sess 1:
SQL> create table test as select * from dba_objects;

Table created.

SQL> insert into test select * from test;

50460 rows created.

SQL> /

100920 rows created.

SQL> /

201840 rows created.

SQL> /

403680 rows created.

SQL> commit;

Commit complete.

SQL> alter table test add pading char(200) default 'a';

Sess 2:

SQL> select sid from v$mystat where rownum=1;

       SID
----------
       152

SQL> select * from test;

hanging


SQL> select event from v$session where sid=152;

EVENT
----------------------------------------------------------------
SQL*Net message from client

SQL> /

EVENT
----------------------------------------------------------------
library cache lock

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
10
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-27 06:00:12ITPUB社区千里马徽章
日期:2013-06-09 10:15:342013年新春福章
日期:2013-02-25 14:51:24奥运纪念徽章
日期:2012-11-28 09:33:31奥运纪念徽章
日期:2012-11-20 10:27:31ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42马上有对象
日期:2014-02-18 16:44:08
35#
发表于 2012-2-28 23:43 | 只看该作者
Lemontree-mxh 发表于 2012-2-28 19:21
Sess 1:
SQL> create table test as select * from dba_objects;

library cache lock只是一种latch竞争等待,并不是一个队列锁的机制,oracle中除了分布式事务中可能存在阻塞读,任何情况都不能存在阻塞读的!相应的你可以看看tom的9I-10G编程艺术中关于锁和事务的6 7 8三章

使用道具 举报

回复
论坛徽章:
1
复活蛋
日期:2011-11-29 22:51:38
36#
发表于 2012-2-29 00:08 | 只看该作者
最安全保险的方法,写个存储过程,自动更新字段,越简单越有效,存储过程写下来也不过10多句。

使用道具 举报

回复
论坛徽章:
0
37#
发表于 2012-3-7 14:19 | 只看该作者
幻雪青枫 发表于 2012-2-27 20:21
都提到需要重建索引,为什么没人提重新加约束呢?

约束 默认值都是得加的

使用道具 举报

回复
论坛徽章:
0
38#
发表于 2012-3-7 14:22 | 只看该作者
耕田书生灬 发表于 2012-2-29 00:08
最安全保险的方法,写个存储过程,自动更新字段,越简单越有效,存储过程写下来也不过10多句。

我写了个存储过程 全自动清理 只需确定清理数据保留的条件就可以了
默认值 索引 约束都是自动生成在临时表里面的。但是不止10多句哦 水平有限

使用道具 举报

回复
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:27:27
39#
发表于 2012-3-7 14:39 | 只看该作者
重新创建表,再把数据导入进去。

使用道具 举报

回复
论坛徽章:
226
BLOG每日发帖之星
日期:2010-02-11 01:01:06紫蛋头
日期:2013-01-12 23:45:222013年新春福章
日期:2013-02-25 14:51:24问答徽章
日期:2013-10-17 18:06:40优秀写手
日期:2013-12-18 09:29:10马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
40#
发表于 2012-3-7 16:07 | 只看该作者
本帖最后由 yangtingkun 于 2012-3-7 16:18 编辑


ALTER TABLE TEST ADD (COLU1 VARCHAR2(10), COLU2 NUMBER);
ALTER TABLE TEST MODIFY (COLU1 DEFAULT 'chn', COLU2 DEFAULT 2222);
RENAME TEST TO T_TEST;
CREATE VIEW TEST AS
SELECT col1, col2..., NVL(COLU1, 'chn'), NVL(COLU2, 2222)
FROM T_TEST;

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表