본문 바로가기

SQL Server

일자(선분) 검색의 성능 개선

CREATE TABLE #DT 
(
	DT CHAR(8) PRIMARY KEY
)


INSERT INTO #DT 
SELECT CONVERT(VARCHAR, DATEADD(D, NUMBER, '20230120'), 112) 
FROM MASTER..SPT_VALUES WHERE TYPE = 'P' AND NUMBER <= DATEDIFF(D, '20230120', '20300120')


SELECT TOP 5000  DT,DUMY2,COUNT(*) FROM TEST1M_DT WHERE DT BETWEEN '20230120' AND '20240120'  
GROUP BY DT,DUMY2 
ORDER BY DT,DUMY2


SELECT TOP 5000 C.* FROM #DT AS A 
CROSS APPLY 
( 
	SELECT  TOP 5000 DT,DUMY2,COUNT(*) AS CNT FROM TEST1M_DT AS B  
	WHERE B.DT = A.DT  
	GROUP BY DT,DUMY2 
	ORDER BY DUMY2 
) AS C 
ORDER BY DT,DUMY2

첫번째 쿼리는 DT 기간에 모든 데이터를 읽고 집계 한 이후에 TOP 5000 으로 자른 반면에

두번째 쿼리는 하루씩 데이터를 집계하고 TOP 5000이 만족하면 종료한다.

일자를 범위로 (선분 데이터) 가져와야 한다는 고정관념을 깨고, 점조건으로 생각을 바꾸면 최소한의 데이터만 

읽고 결과를 도출할수 있다.

BETWEEN 쿼리에 비해 임시 테이블에 담아 LOOP JOIN 으로 변경하면 성능이 개선된다.

 

'SQL Server' 카테고리의 다른 글

FIRST_VALUE  (0) 2023.02.02
쿼리 수행 시간 체크  (0) 2023.01.26
SQL Server JSON 함수(Transact-SQL)  (0) 2023.01.11
SQL Server 통계 Stream 생성 샘플 쿼리  (0) 2023.01.10
JSON Insert Update Create Index  (0) 2023.01.10