表結構(a.b.c,src,time)
約束如下:
Src 表示來源,time表示最新時間。全量表是10億條記錄,a上有一個索引,邏輯上a,b,c唯一確定一條記錄。應該怎么設計
業務需求:
每天不同來源的src有總量大概百萬級的資料,用這些資料放在每日增量表中,然后去更新全量表,到時候插入時,如果同一來源src下a.b.c相同就只更新時間,這個運算時間可能會比較長,求高手指點應該怎么辦
uj5u.com熱心網友回復:
邏輯上a,b,c唯一確定一條記錄在這三個欄位上建立 PK 。
使用 merge 更新;
uj5u.com熱心網友回復:
鑒于資料總量太大,可以考慮用磁區表uj5u.com熱心網友回復:
a,b,c 三個建立唯一性約束,或者PK;假如src 個數低于4000 需要建立range磁區 表;
uj5u.com熱心網友回復:
時間間隔磁區uj5u.com熱心網友回復:
如果不用Oracle用啥大資料的組建,redis?應該是a,b,c, 在同一來源下唯一確定一條記錄
uj5u.com熱心網友回復:
“到時候插入時,如果同一來源src下a.b.c相同就只更新時間“,按照時間磁區,不管你是LIST,還是RANG,你都要掃描全表判定a, b ,c 是否存在,試問有何意義?
uj5u.com熱心網友回復:
我就發愁有的src下面資料量太多,來資料要掃描全表,吃不消
uj5u.com熱心網友回復:
一、索引是樹狀結構,查找并不需要全表掃描。二、a,b,c 中如果有字串欄位,把字串移到其它字典表中,這里只用整型的id,加快處理速度。
三、每日增量表用(日期,a,b,c)做主鍵(其中日期不包含時間),每天遍歷的次序和全量表檢查/更新的次序一致。
四、每日增量表以1000條分批,每批一個事務,百萬級也只不過幾千次事務。
uj5u.com熱心網友回復:
增量表只存每天新增的資料,每日接收增量資料前把原來的資料清空(備份到其他表也可,防止后期資料出錯),對增量表和全量表的A、B、C三個欄位建立唯一性索引,time表示最新時間,說明time欄位會精確到秒或毫秒,建議增量表和全量表都增加一個date日期欄位,比如tradingdate,對該欄位建立range磁區索引。
附存盤程序:
MERGE INTO 全量表 T USING
(SELECT A,B,C,SRC,TIME
FROM 增量表)S
ON(T.A=S.A AND T.B=S.B AND T.C=S.C)
WHEN MATCHED THEN
UPDATE SET
(T.TIME=SELECT.TIME)
WHEN NOT MATCHED THEN
INSERT T
(T.A,
T.B,
T.C,
T.SRC,
T.TIME)
VALUES(
S.A,
S.B,
S.C,
S.SRC,
S.TIME)
;
PS:本人也是菜鳥,意見僅供參考,以陳述句實際執行效率為準。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/107668.html
標籤:開發
上一篇:同一表中兩列資料不能相同
