[MSSQL] 테이블에 레코드가 쌓일수록 느려지는 update문 0 0 606

by 곰장어 [2021.02.26 11:25:51]




UPDATE {tableName} SET 존재여부 ='Inserted' WHERE 상품코드 = @상품코드  
                               IF EXISTS (SELECT 상품코드 FROM {tableName} WHERE 상품코드 = @상품코드) 
                               BEGIN 
                                UPDATE {tableName} 
                                  SET 상태 ='변경'
                                    , 구매가 = @구매가
                                    , 상품명 = @상품명
                                    , 옵션명 = @옵션명
                                    , 옵션값 = @옵션값
                                    , 옵션가격 = @옵션가격
                                    , 존재여부 = 'I'
                                    , 변경내용 = (CASE WHEN 구매가 <> @구매가 THEN '구매가: ' + 구매가 + '→' + @구매가 + ' ; ' ELSE '' END +
                                                CASE WHEN 상품명 <> @상품명 THEN '상품명: ' + 상품명 + '→' + @상품명 + ' ; ' ELSE '' END +
                                                CASE WHEN 옵션명 <> @옵션명 THEN '옵션명: ' + 옵션명 + '→' + @옵션명 + ' ; ' ELSE '' END +
                                                CASE WHEN 옵션값 <> @옵션값 THEN '옵션값: ' + 옵션값 + '→' + @옵션값 + ' ; ' ELSE '' END +
                                                CASE WHEN 옵션가격 <> @옵션가격 THEN '옵션가격: ' + 옵션가격 + '→' + @옵션가격 + ' ; ' ELSE '' END

                                WHERE (구매가 <> @구매가 OR 상품명 <> @상품명 OR  옵션명 <> @옵션명 OR 옵션값 <> @옵션값 OR 옵션가격 <>@옵션가격) 
                                  AND 상품코드=@상품코드 
                               END
                              ELSE 
                               BEGIN 
                                INSERT INTO {tableName} 
                                  VALUES(@상품코드,@상품명@구매가@옵션명 ,@옵션값,@옵션가격,'Inserted',@변경내용) 
                                END";

 UPDATE {tableName}  SET 변경내용= '단종' WHERE 존재여부<>'Inserted'";

UPDATE {tableName} SET 존재여부='';

 

위 쿼리는 

1. 테이블에 상품코드가 존재하면서 특정 컬럼값이 현재 입력하려는 값과 다르면 update를 수행하고,

2. 상품코드가 존재하지 않다면 Insert,

3. 위 두작업을 모두 수행한후에 존재여부 컬럼값이 Inserted 가 아니면 해당 컬럼을 '단종' 으로 변경

(기존 테이블에 1만개 레코드가 있었고, 이후 Insert,Update 하려는 B라는 테이블의 레코드는 9천개라고 했을때,

기존테이블의 9천개 레코드의 '존재여부' 컬럼값은 위 선행작업으로 인해 Inserted로 변경이 되어있을거고,

 Inserted가 없는 1천개는 레코드는 이후  B라는 테이블에는 없는 상품이므로 '단종' 으로 변경) 

 

위 쿼리를 C# 프로그램의 반복문내에서 한건씩 수행하고있는데요,

테이블에 레코드가 1만개 내외면 괜찮은 속도가 나오는데 (초당 100개정도)

10만개 100만개 이런 테이블에서는 속도가 현저하게 느려지는거 같습니다

레코드가 늘어날수록 위 update문에서 필터링할 내용이 많아서 그런걸까요??

 

테이블에 레코드가 아무리 많아도 일정한 퍼포먼스가 나오게끔 개선할수있는 좋은 방법이 있을지 조언주시면 감사하겠습니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입