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문에서 필터링할 내용이 많아서 그런걸까요??
테이블에 레코드가 아무리 많아도 일정한 퍼포먼스가 나오게끔 개선할수있는 좋은 방법이 있을지 조언주시면 감사하겠습니다