SQL Server
일자(선분) 검색의 성능 개선
DBASeoul
2023. 1. 20. 16:19
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이 만족하면 종료한다.
일자를 범위로 (선분 데이터) 가져와야 한다는 고정관념을 깨고, 점조건으로 생각을 바꾸면 최소한의 데이터만
읽고 결과를 도출할수 있다.