今天下午和同事發生因為判斷數據是否在數據庫中已存在產生分歧.簡易代碼如下:
//观点一,先取出数据库中已存在ID存入内存,再进行判断
//数据太多情况,内存爆炸
DateTable dt = ExcuteSQL('SELECT ID FROM TABLE');
//List为数据集,已经去重
foreach(var item in List){
//观点二,在for循环中根据ID查询是否已存在
//for循环执行数据库?没这么干过
DateTable dt = ExcuteSQL(string.format('SELECT ID FROM TABLE WHERE ID = {0}',item.ID));
//判断是否在dt中存在
...
bool ISContain
...
//不存在
if(!ISContain){
//加入事物SQL列表
SQLList.Add('INSERT INTO ........');
}
}
//执行事物
....
迷茫2017-04-18 10:56:26
其實第一個你要拿實際資料量來估算,如果ID是Long類型,資料量100W,也才只有 8byte * 100W = 7.629 megabytes。
第二個肯定要不得,在循環中對每個ID去查詢。
天蓬老师2017-04-18 10:56:26
推薦方法二,但這樣做查詢會比較快:
SELECT id FROM table WHERE id IN (?, ?, ?, ...)
注意,不同的資料庫對參數是有限制的,?
最好不要超過1千個。如果你需要判斷1萬個id,就用10次這樣的查詢。
黄舟2017-04-18 10:56:26
利用 @auntyellow 同學所說的方法應該比較好,批量查詢。當ID比較多時,考慮是否可以按其它的批量去查?例如一次拿一段時間的所有id
,把方法一稍加改進來實現。
感覺不管是方法一還是方法二都走了極端,所以好的解決方法應該是中合兩者的結果。