今天下午和同事发生因为判断数据是否在数据库中已存在产生分歧.简易代码如下:
//观点一,先取出数据库中已存在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.629MB에 불과합니다.
두 번째는 꼭 필요합니다. 루프에서 각 ID를 쿼리하는 것입니다.
天蓬老师2017-04-18 10:56:26
권장되는 두 번째 방법이지만 이 쿼리가 더 빠릅니다.
으아아아데이터베이스마다 매개변수에 대한 제한이 있습니다. ?
1,000을 초과하지 않는 것이 가장 좋습니다. 10,000개의 ID를 결정해야 하는 경우 해당 쿼리를 10개 사용하세요.
黄舟2017-04-18 10:56:26
@auntyellow님이 알려주신 방법을 이용해서 일괄적으로 쿼리하는 것이 더 좋을 것 같습니다. ID가 많은 경우 다른 배치 방식으로 확인할 수 있는지 고려해보세요. 예를 들어 일정 기간 동안 모든 id
을 한 번에 가져오고 이를 달성하려면 방법 1을 약간 개선하세요.
방법 1과 방법 2가 모두 극단적인 것 같아서 두 방법을 조합하는 것이 좋은 해결책이 될 것입니다.
怪我咯2017-04-18 10:56:26
먼저 데이터베이스에서 ID를 가져온 후 메모리에서 비교하는 방법을 사용하는 것이 좋습니다. 이는 데이터베이스 액세스를 줄일 수 있습니다.