db2大数据更新
⑴ 在DB2数据库中,怎样获得UPDATE语句更新的数据的数据量 如果是保存到日志中,怎样提取出来呢
是想问修改的记录数?
执行db2 -m进入,
db2 => list command options
其中
-m 显示受影响的行数 ON
db2 => update test100 set c=0
受影响的行数:3
DB20000I SQL 命令成功完成。
也可以先执行一条SELECT语句将合乎条件的记录数选择出来。例如:
select count(*) from a where ...
然后执行update。当然严重影响效率。
日志中如果采用前像后像技术会有一页中修改多条记录等情况的。
⑵ DB2 数据库批量更新的问题
增加一个字段好解决啊,命令如下:
alter table tableA add column columnA character(2);
commit;
更新这个字段,这个字段的值等于行号就可以了,第一张就1,第二行就是2,等等;
所以接下来你就要自动生成一个行号,在表中找个重复字段cut_a(只有一个相同的值)
然后运行下面的命令
select ROW_NUMBER() OVER (ORDER BY cut_a) AS NUMBER_1 from cut_a;
这样NUMBER_1跑出来就是1,2,3,……一列值,然后运行下面命令
set tableA update columnA=NUMBER_1
;
方法二:你直接运行第二段就是把2 NUMBER_1改成columnA就好了;
select ROW_NUMBER() OVER (ORDER BY cut_a) AS columnA from cut_a;
⑶ DB2数据更新问题
按照你的说法,是先从一个表(假定表名为A)里读取1000行数据,然后到正式表(假定表名为B)里分别判断每条记录,如果没有这条记录就INSERT到正式表,如果正式表有这条记录就UPDATE正式表的数据,然后再处理下一个1000行。我这个理解正确吗?
如果是这样的话,从A表取数据的WHERE条件中的谓词应该建成一个复合索引,并且排序字段建成一个单独的索引(rownumber() over(order by 排序字段 asc ) as rowid),这样能很大程度上加快读的速度,这个语句频繁执行,是优化的关键点。
接下来判断每条记录在B表是否存在,这个WHERE条件中的谓词也应该建成一个复合索引,因为这个语句会频繁执行,也是优化的关键点。
然后是判断,不知道你用的是什么语言来实现,这个地方已经跟数据库没有关系了,无法优化。
接下来是插入,如果能批量操作,就考虑批量,比如JDBC的接口中addBatch()等方法,同时给B表添加append on特性,可以很大程度的加快插入速度,是优化的关键点。使用append 特性以后,请注意定期reorg table,alter table TAB_NAME append on。
接下来是更新,同样是做成批量操作,这个UPDATE的WHERE条件中的谓词也建成一个复合索引,这个语句频繁执行,也是优化的关键点。
然后数据库层面:
日志缓冲池(LOGBUFSZ)调整成8192个页面,可以减少日志I/O,这个也是优化的关键点;
活动日志、归档日志所在的磁盘与数据所在的磁盘要分开,因为I/O是数据库最耗时的操作,瓶颈一般都处在这个地方,这个也是优化的关键点;
数据和索引及大字段分开存放在不同的表空间,数据和索引不要用文件缓存,大字段启用文件缓存;
索引使用的缓冲池最好保证索引完全能够容纳进去,这样能很大的加快查询速度,这也是优化的关键点;
日志文件大小最好定义为100MB,主日志大小定义为10,辅助日志大小定义为20,即LOGFILSIZ=25600,LOGPRIMARY=10,LOGSECOND=20,这样可以减少日志频繁归档和保证一个事务可以进行更多的DML操作;
每次操作不要只对1000行记录进行操作就提交,因为频繁提交很耗时,建议调整为每次2W条,上面所说的日志配置应该足够确保不会出现日志空间满的问题。
我在银行的批处理操作中做过12个参数表的这种临时表、正式表、查询、判断、INSERT、UPDATE的操作,总数据量有14W条记录,操作时间都是在10分钟以内结束,而且是一台服务器上三个环境都有这样的作业在同时执行(即访问临时表和正式表中不同的记录)。
按照这个估算,你的280W条记录,应该可以在200分钟内结束。
我程序中用到的是JAVA、MYBATIS、SPRING的手动事务。
附:我拥有DB2 V9的所有认证,希望我的回答对你有所帮助。
⑷ db2数据库中update的一个简单用法:
UPDATE T_PM_USER USER
SET USER.FNUMBER =
(SELECT PER.FNUMBER
FROM (SELECT PER.FID, PER.FNUMBER
FROM T_ORG_ADMIN AD
INNER JOIN T_HR_PERSONPOSITION PERPO
ON AD.FID = PERPO.FPERSONDEP
INNER JOIN T_BD_PERSON PER
ON PERPO.FPERSONID = PER.FID
WHERE AD.FNAME = '财务处') TEMP
WHERE USER.FPERSONID = TEMP.FID)
着急下班,不知道关联的字段对不对。答题思路是这样
⑸ db2 update 字段只对一行更新但所有行全部更新成null
update crm_cmg_mon_register a set a.val16=(
select b.SERIAL_NO from crm_cmg_register b where b.date_id='2014-03-16' and a.custmgr_id=b.custmgr_id
) where a.date_id='201403'
你这句SQL肯定会出问题啊,这句相当于:
update crm_cmg_mon_register set val16=? where a.date_id='201403'
把条件为 a.date_id='201403'数据都更新了。
多表关联更新要在where后面要加上关联条件。
正确:
update crm_cmg_mon_register a set a.val16=(
select b.SERIAL_NO from crm_cmg_register b where b.date_id='2014-03-16' and a.custmgr_id=b.custmgr_id
) where a.date_id='201403' and
exists (select 1 from crm_cmg_register b where a.custmgr_id=b.custmgr_id )
⑹ db2大量数据千万级表更新
这种情况我以前也碰见过,一般的数据库都搞不定,几千万的数据,在进行比较并更新插入数据,得很大的临时表空间和数据库日志文件,我是用load搞定的,
创建一个临时表,用load cursor做,
⑺ 一个DB2数据库表中数据更新的问题
我试过可以的啊,不知道你那里为什么不行。
--创建测试环境
createtabletest(coltestvarchar(254));
--插入测试数据
insertintotestvalues('123');
insertintotestvalues('234');
insertintotestvalues('223');
--查询表数据情况
select*fromtest
--执行更新情况
updatetestsetcoltest=char('0000000000')||coltest
wherecoltest='123'
--查看更新后的数据
select*fromtest
⑻ 请教一个DB2数据库 SQL update 语句
表A,有6个字段,id,a,b,c,d,e,其中主键是id,a,b,c。a1=a2,b1=b2,c1=c2 有3条记录:
1,a1,b1,c1,d1,e1
2,a2,b2,c2,d2,e2
3,a3,b3,c3,d3,e3
update tablename set e=(select sum(e) from tablename where a=a1) where id = 1
查询出 a=a1 即 1,2 列并将e求和,然后赋值给 id=1这一列的e字段上
⑼ DB2 从将TEST表的数据更新到B表,报错 SQLCODE=-811, SQLSTATE=21000
select b.fff from TEST b
where aaa=b.aaa
and ttt=b.ttt
and ccc=b.ccc
group by b.aaa,b.ttt,b.ccc,b.fff 这一段查询出来的值大于1行,赋值失败