찾다

 >  Q&A  >  본문

java - 判断数据在数据库中是否已存在.

今天下午和同事发生因为判断数据是否在数据库中已存在产生分歧.简易代码如下:

    //观点一,先取出数据库中已存在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 ........');
         }
    }
    
    //执行事物
    ....

怪我咯怪我咯2804일 전980

모든 응답(6)나는 대답할 것이다

  • 迷茫

    迷茫2017-04-18 10:56:26

    사실 가장 먼저 추정해야 할 것은 실제 데이터 양입니다. ID가 Long 유형이고 데이터 양이 100W라면 8byte * 100W = 7.629MB에 불과합니다.

    두 번째는 꼭 필요합니다. 루프에서 각 ID를 쿼리하는 것입니다.

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:56:26

    권장되는 두 번째 방법이지만 이 쿼리가 더 빠릅니다.

    으아아아

    데이터베이스마다 매개변수에 대한 제한이 있습니다. ?1,000을 초과하지 않는 것이 가장 좋습니다. 10,000개의 ID를 결정해야 하는 경우 해당 쿼리를 10개 사용하세요.

    회신하다
    0
  • 黄舟

    黄舟2017-04-18 10:56:26

    @auntyellow님이 알려주신 방법을 이용해서 일괄적으로 쿼리하는 것이 더 좋을 것 같습니다. ID가 많은 경우 다른 배치 방식으로 확인할 수 있는지 고려해보세요. 예를 들어 일정 기간 동안 모든 id을 한 번에 가져오고 이를 달성하려면 방법 1을 약간 개선하세요.
    방법 1과 방법 2가 모두 극단적인 것 같아서 두 방법을 조합하는 것이 좋은 해결책이 될 것입니다.

    회신하다
    0
  • 黄舟

    黄舟2017-04-18 10:56:26

    https://www.zhihu.com/questio...

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-18 10:56:26

    먼저 데이터베이스에서 ID를 가져온 후 메모리에서 비교하는 방법을 사용하는 것이 좋습니다. 이는 데이터베이스 액세스를 줄일 수 있습니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 10:56:26

    메모리로 분할할 수 있나요? 이렇게 하면 메모리 사용량을 줄일 수 있나요?

    회신하다
    0
  • 취소회신하다