ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DB] Bulk Insert VS 단일 Insert 비교 실험
    TIL 2024. 3. 25. 22:26

     

     

    프로젝트 알림기능을 구현하던중, 동시에 여러명에게 알림 데이터를 추가해야하는 상황이 발생했다.

     

    원래 for문을 돌려서 insert문을 회원수만큼 돌리려고했으나 나중에 이것이 비효율적이라는 사실을 알게 되었다.

     

    (SELECT문으로 가져온 데이터의 개수만큼 반복문으로 다시 쿼리문을 실행하는 것은 이 작업이 얼마나 오래 걸릴지 가늠

     

    조차할수 없을 정도로 큰 작업이 될 수 있기 때문에 반드시 제약해주는 장치가 있어야한다. Like Bulk Insert)

     

    그러다 Bulk Insert문을 이용해서 한번에 데이터들을 삽입할 수 있다는 것을 알게되어 단일 Insert와 비교해보기로 했다.

     

     

     

    Bulk Insert)

    한번의 Insert문 안에 VALUES를 여러개 넣어주면된다 

    INSERT INTO 
    	films (code, title, did, date_prod, kind) 
    VALUES  
    	('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),  ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');

     

     

     

     

     
     

     

     

     

     

     

     

     

    비교)

     

    1000개의 데이터를 동시에 삽입한다고할때 Bulk Insert로 한번에 1000개의 데이터를 삽입하는 것과

     

    단일 Insert문을 1000번돌려서 데이터를 삽입하는 것의 성능 차이를 비교해보자

     

     

     

     

     

     

     

     

     

    단일 Insert * 1000번 돌려서 데이터 넣기

    //단일 insert 반복
    router.post('/request/normal-insert', checkLogin, async (req, res, next) => { 
        try {
            for (let i = 0; i < 1000; i++) {
                await pool.query(
                    `
                    INSERT INTO
                        request(user_idx, title)
                    VALUES
                        ( $1 ,$2 )`,
                    [1, i]
                );
            }
            res.status(200).send();
        } catch (e) {
            next(e);
        }
    });

     

    실행결과 : 10.41초, 9.20초, 9초, 10.75초, 9.3초, 9.07초, 9.27초

     

     

     

     

     

     

    Bulk Insert로 한번에 1000개 데이터 넣기

    //bulk insert로 한번에 삽입하기
    router.post('/request/bulk-insert', checkLogin, async (req, res, next) => {
        try {
            let sql = `
                INSERT INTO
                    request(user_idx, title)
                VALUES
                    ( 0, '시작' )`;
    
            for (let i = 1; i <= 1000; i++) {
                bulk = `,(${i}, ${i})`;
                sql += bulk;
            }
    
            await pool.query(sql);
    
            res.status(200).send();
        } catch (e) {
            next(e);
        }
    });

     

    실행결과 : 71ms, 75ms, 61ms, 55ms, 26ms, 43ms, 70ms

                     (0.071초, 0.075초, 0.061초, 0.055초, 0.026초, 0.043초, 0.07초)

     

     

     

     

     

    1000건의 데이터를 넣는데 100배 이상의 성능차이가 발생했다

     

    더 많은 수의 데이터를 가지고 비교해보려했으나, 단일 Insert문의 반복이 너무 오래걸려서 데이터의 수를 낮췄다.

     

     

     

    기대했던것 이상으로 훨씬 크게 성능차이가 발생하는 것을 알 수 있었다.

     

    반복문으로 insert SQL을 이용하는 것은 매우 비효율적이다

Designed by Tistory.