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行,賦值失敗