sybase数据库表,有一个字段为3位的数字,现在想把它全部改为4位。注:unix服务器,远程登录修改,且此表有100万条以上的纪录。最好的方
sybase数据库表,有一个字段为3位的数字,现在想把它全部改为4位。注:unix服务器,远程登录修改,且此表有100万条以上的纪录。最好的方法是什么?十万火急!! 问题点数:0、回复次数:12Top
1 楼echo7410(hgl)回复于 2003-09-03 17:00:36 得分 0
对了,是在此字段的每条纪录前面加一个 1,怎么样做才能 又 快又保险?Top
2 楼xyzhh(逍遥者寒号)回复于 2003-09-03 17:42:54 得分 0
没有好的办法,自己写存储过程解决吧。说说自己的思路:可以新建一个表,比原来的表多一个自增行字段,用inert into tb_a select (c1,c2...) from tb_b把数据插到新表里,然后用存储过程根据自增行字段对每一条数据进行处理(此字段的每条纪录前面加一个 1),然后再用此法把数据insert回去。
Top
3 楼echo7410(hgl)回复于 2003-09-03 17:50:28 得分 0
谢谢您的建议,但是有 一个问题是表里的数据太庞大了,而修改又不能用太多的时间,所以想找一种比较快的方法,如果这样的话100万条记录得用多少时间?Top
4 楼nice90(我爱射雕,更爱蓉儿)回复于 2003-09-03 17:53:39 得分 0
我是赵敏。
如果不使用两个表,很难的。
我建议将这个表的所有数据导出到另外一个表中。例如原表为a表,第二个表为b表.
a(telephone,name)
b(telephone,name)
语句:
update a set telephone='1'+ b.telephone from a,b where a.name=b.name
这条语句在SQL Server里可以实现。
当然如果使用触发器可能也行,而且让用户自己更新。
每当用户输入该号码的时候,检查用户输入的后面几位是否和原来数据库中的相同,如果相同,则可以将该条记录更新,同时返回正确的结果。Top
5 楼nice90(我爱射雕,更爱蓉儿)回复于 2003-09-03 17:56:14 得分 0
这里要求name字段也是唯一的值。Top
6 楼xyzhh(逍遥者寒号)回复于 2003-09-03 18:04:07 得分 0
修改100万条数据,怎么也快不了Top
7 楼nice90(我爱射雕,更爱蓉儿)回复于 2003-09-03 18:09:55 得分 0
看了这个问题:
http://search.csdn.net/expert/topic/18/1802/2002/3/12/570725.htm
我对我的答案有几分信心了,同样是使用的Sybase,两个表,请看:
测试记录
test_1 1030100 records
Load Time:13.569 secs;
test_2 1130100 records
Load Time:14.210
select count(a.product)
from test_1 a,test_2 b
where
a.product=b.product
结果:687554;
联合查询:
select a.product,a.age,a.gender,a.age2,a.gende2r from
test_1 a,test_2 b
where
a.product=b.product
结果:15秒左右
联合查询+插入:
create table test_3(product varchar(16),age integer,gender integer,age3 integer,gender3 integer);
insert into test_3 select a.product,a.age,a.gender,b.age2,b.gende2r
from
test_1 a,test_2 b
where
a.product=b.product
插入687554条,时间42.912secs
平均 16022条/sec
批量更新:
用test_2的age2,gende2r字段更新test_1的age3,gender3字段;
update test_1 a set age3=b.age2,gender3=b.gende2r from test_2 b where a.product=b.product ;
更新了687554条,时间31.606secs
avg: 21754条/sec
test_1 10301000 records
Load Time:91.552 secs;
112515/sec
test_2 11301000 records
Load Time:101.777
111036条/sec
select count(a.product)
from test_1 a,test_2 b
where
a.product=b.product
结果:6867362;
联合查询:
select a.product,a.age,a.gender,a.age2,a.gende2r from
test_1 a,test_2 b
where
a.product=b.product
结果:180秒左右
联合查询+插入:
create table test_3(product varchar(16),age integer,gender integer,age3 integer,gender3 integer);
insert into test_3 select a.product,a.age,a.gender,b.age2,b.gende2r
from
test_1 a,test_2 b
where
a.product=b.product
插入6867362条,时间484.697secs
avg: 14168/sec
批量更新:
用test_2的age2,gende2r字段更新test_1的age3,gender3字段;
update test_1 a set age3=b.age2,gender3=b.gende2r from test_2 b where a.product=b.product ;
更新了6867362条,时间393.966secs
avg: 17431/secTop
8 楼zyhlhx(踏雪无痕)回复于 2003-09-03 18:10:00 得分 0
我觉得这样可能比较好:
1、建立一个视图 ,create view as select col1,col2, '1'+col3,... 等
from tablea
2 、bcp view 出来
3 ,改名(删除)原来的表
4 、建立新符合要求的表,并 bcp 数据到这个表
这个应该最快,并且不会有大的日志。
Top
9 楼hanps()回复于 2003-09-04 14:35:38 得分 0
楼上的方法,是可以,不过速度。。。Top
10 楼zyhlhx(踏雪无痕)回复于 2003-09-04 14:41:03 得分 0
速度怎么样?当然是最快的,如果记录超过 100万 ,对 io 读写也最少
这个是我经过验证的秘籍!
Top
11 楼xyzhh(逍遥者寒号)回复于 2003-09-05 09:14:45 得分 0
同意楼上的Top
12 楼cuizu(如风)回复于 2003-09-05 09:46:41 得分 0
1、先把表上的索引抽出来,
2、然后drop掉索引
3、抽出数据
4、修改数据,倒入数据
在没有索引的时候插入数据还是很快的,不过注意清空日志。Top




