Heim > Fragen und Antworten > Hauptteil
今天下午和同事发生因为判断数据是否在数据库中已存在产生分歧.简易代码如下:
//观点一,先取出数据库中已存在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
,把方法一稍加改进来实现。
感觉不管是方法一还是方法二都走了极端,所以好的解决方法应该是中合两者的结果。