[問題] 用資料庫比對或是AP比對

看板Programming作者時間10年前 (2015/05/31 18:11), 10年前編輯推噓0(0015)
留言15則, 3人參與, 最新討論串1/2 (看更多)
請問各位大德 假設有兩百個檔案(或更多) 每個檔案筆數是40000(四萬)筆 資料庫資料大約是幾千萬筆 目標是要將每個檔案去碰資料庫內存有的資料,然後做比對 環境只能用 UNIX的/bin/sh 和資料庫 那該怎麼做會比較佳呢? 檔案內容比如說: number|starttime|endtime|sum 1111|04/01/2015|04/30/2015|10 1111|04/01/2015|04/30/2015|30 2222|04/01/2015|04/30/2015|20 2222|04/01/2015|04/30/2015|40 5555|04/01/2015|04/30/2015|10 9999|04/01/2015|04/30/2015|7 要將檔案的number去和資料庫內的某個table碰number後,得到number2(primary key) 再去其他table用number2做搜尋且加總用量(sum),然後比對! 目前的做法: 寫迴圈一個一個檔案load進資料庫temp table內 用sql去執行比對再unload下來,但是效能不佳(每個檔案都要跑大概15~20分鐘) temp table加上index似乎也不會變快 改良的想法: 目前我想到的改良作法是一次將資料庫所需資料unload下來 再用程式(可能開五支或更多背景程式)去執行grep之類的 這樣也不會耗太多DB資源 這樣會不會有點多餘或是這是糟糕的想法呢? 是否請大德們可以給點建議或是提示呢? 謝謝 ^^ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 182.235.82.125 ※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1433067117.A.448.html

05/31 18:13, , 1F
聽起來你在SQL裡面寫迴圈 是這樣嗎
05/31 18:13, 1F

05/31 18:15, , 2F
不是,是在外面寫迴圈
05/31 18:15, 2F

05/31 18:49, , 3F
那你使用SQL如何比對
05/31 18:49, 3F
大大您好 我sql比對寫法是包在shell內,內容大意如下: for迴圈 do db語法 << EOF create temp table aa(...省略 ) with no log; load from 檔案 insert into aa; unload to mydata.txt select 所需欄位 from aa a, XXXtable b, outer XXXtable c where b.id=a.id and b.id=c.id and (...這裡下的一堆條件都是按照資料庫現有index順序下的) group by 欄位 EOF done 其實就是這樣而已,並沒有甚麼特別之處 但是就是很慢 不管是條件順序或是temp table的index我都調過或加過 DB不只我程式會執行 還有其他人程式也會去做其他作業 不曉得大大覺得哪邊可以調整呢? :D ※ 編輯: smallyou1988 (182.235.82.125), 05/31/2015 22:25:19 ※ 編輯: smallyou1988 (182.235.82.125), 05/31/2015 22:27:01

05/31 22:52, , 4F
研究一下join 應該只需要用一次inner
05/31 22:52, 4F

05/31 22:53, , 5F
join就可得到所有特定欄位相同的列
05/31 22:53, 5F

06/02 20:29, , 6F
改用left join, 刪減不必要select
06/02 20:29, 6F

06/02 20:29, , 7F
的欄位了
06/02 20:29, 7F

06/03 07:15, , 8F
確認一下table是在那個space建立.
06/03 07:15, 8F

06/03 07:16, , 9F
script看能不能拆開用parallel執行.
06/03 07:16, 9F

06/03 07:18, , 10F
跑profiler察一下效能瓶頸.
06/03 07:18, 10F

06/03 07:47, , 11F
為何要把檔案讀進資料庫在比對?
06/03 07:47, 11F

06/03 07:48, , 12F
不能直接在script裡面比?
06/03 07:48, 12F

06/03 07:49, , 13F
用PK撈出來的資料量會很大?
06/03 07:49, 13F

06/05 17:25, , 14F
既然用join應該就把所有資料合成一張大
06/05 17:25, 14F

06/05 17:25, , 15F
表 join一次就有全部結果了
06/05 17:25, 15F
文章代碼(AID): #1LQjvjH8 (Programming)
文章代碼(AID): #1LQjvjH8 (Programming)