본문 바로가기
IT/MSSql

[MSSQL] 쿼리 튜닝 - 임시 테이블

by 뉴비 출근러 2025. 4. 24.
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