728x90
튜닝 공부 1회차
XML을 읽어 MERGE하는 연습을 해보던 중 성능이 궁금하여 실행 계획을 살펴봤다.
2가지의 임시테이블을 사용하는 경우를 테스트 해보았다.
728x90
1. 임시테이블 CREATE와 동시에 INSERT
SELECT *
INTO #TMP
FROM
(
SELECT OrderID,
ProductID,
Quantity
FROM OPENXML(@idoc, '/ROOT/Customer/Order/OrderDetail',3)
WITH
(
OrderID VARCHAR(10),
ProductID VARCHAR(20),
Quantity INT
)
) AS #TMP
2. 임시테이블을 CREATE한 후 INSERT
CREATE TABLE #TMP (
OrderID INT,
ProductID INT,
Quantity SMALLINT
)
INSERT INTO #TMP
(
OrderID,
ProductID,
Quantity
)
SELECT OrderID,
ProductID,
Quantity
FROM
OPENXML(@idoc, '/ROOT/Customer/Order/OrderDetail',3)
WITH
(
OrderID INT,
ProductID INT,
Quantity SMALLINT
)
첫번째 방법이 쿼리 작성할 내용이 더 적어서 먼저 작성했던 방법인데 쿼리 실행 계획을 열어보니
MERGE를 할 때 사진과 같이 경고 창이 나왔다..
경고 내용을 잘 읽어보니 형식 변환과 관련이 있어 보였다.
MERGE에는 분명 같은 데이터를 가지고 있는 컬럼끼리 JOIN을 했는데도 말이다..
고민과 검색을 하다가 발견한 사실은 임시테이블을 생성하고 데이터를 넣을 때 프로파일러가 "추측"을 통해 임시테이블의 자료형을 생성한다는 내용이 있었다!
INSERT한 테이블의 컬럼의 자료형이 INT였어도, 임시테이블에는 VARCHAR, NVARCHAR가 될 수 있고, 이를 비교, JOIN할 때 CONVERT가 이뤄진다는 것이였다!
그래서 해결한 방법이 2번째(임시 테이블 생성 후 INSERT)이다.
명시적으로 자료형을 선언함으로써 프로파일러가 CONVERT하지 않아 성능이 쬐끔이나마 좋아진다는 것이였다!!
지금은 테스트 DB를 사용중이라 데이터가 적어 차이가 없어 보이지만 수만개의 데이터를 다루면 차이가 있지 않을까 조심스레 생각해본다.
728x90
'IT > MSSql' 카테고리의 다른 글
[MSSQL] 문자 띄어쓰기 해결법 (SSMS) (0) | 2025.04.22 |
---|---|
[MSSQL] SP_LOCK (LOCK 조회) (0) | 2025.04.22 |
[MSSQL] DB 스케줄 자동 백업 관리 (0) | 2025.04.22 |
[MSSQL]날짜 형 변환 / CONVERT(자료형,DATETIME,형식) (0) | 2025.04.22 |
[MSSQL] 쿼리 속도 향상을 위한 팁 - 3 (0) | 2025.04.22 |