아래 같이 페이징 쿼리 3개 종류 입니다.
고수님들은 보통 쿼리 비교해서 퍼포먼스를 찾을때 보통 어떻게 하는 궁금합니다.
ㄱ) Count(*) Over() As TotalCount 로 카운트를 가져옴
With As TB_TMP (
Select ROW_NUMBER() Over (Order By insertdate) As RowNum,
, Count(*) Over() As TotalCount
* From TB_TABLE
) Select * From TB_TMP WHERE RowNum Between x And y
ㄴ) Max(RowNum)로 카운트를 가져옴
With As TB_TMP (
Select ROW_NUMBER() Over (Order By insertdate) As RowNum, * From TB_TABLE
) Select *, (Select Max(RowNum) From TB_TMP) As TotalCount From TB_TMP WHERE RowNum Between x And y
ㄷ) Select Count(*)로 카운트를 가져옴
With As TB_TMP (
Select ROW_NUMBER() Over (Order By insertdate) As RowNum, * From TB_TABLE
) Select *, (Select Count(*) From TB_TMP) As TotalCount From TB_TMP WHERE RowNum Between x And y
#) 실제 위를 Ctrl + l 을 통해서 실행해 보면 쿼리 비용은?
ㄱ => 25%
ㄴ => 41%
ㄷ => 34%
#) 실제 위를 SET STATISTICS TIME ON 를 통해서 보면 Ctrl + l 통해서 본 비용과는 반대로 ㄷ이 시간이 가장 좋더라고요
ㄱ) => CPU 시간 = 936밀리초, 경과 시간 = 2679밀리초
ㄴ) => CPU 시간 = 624밀리초, 경과 시간 = 2248밀리초
ㄷ) => CPU 시간 = 577밀리초, 경과 시간 = 2177밀리초
MSSQL 쿼리를 비교해서 퍼포먼스 정답을 찾을 때 보통 어떻게 하면될까요?
Ctrl + l 을 통한 최저 비용? 아니면 CPU 시간이 적은 것?
Comment 4
-
이리
2022.06.03 10:45
-
감프
2022.06.03 11:30
귀한 답변 감사합니다.
-
지영아빠
2022.06.03 11:07
감프님..
성능에는 정답이라기 보다는 데이터량나 서버의 상태, 그리고 실행되는 횟수등을 고려해야 하는 최적화의 문제라고 봅니다.
보통은 cpu, io가 낮으면 time이 낮게 나온다는 건 공식적인 것이긴 하지만
꼭 그렇지 않을때가 있으며
그런 와중에 하나에 하나를 선택해야 한다면 서버의 상태와 서비스에 최적화를 해야 하는지 선택해야 하지 않을까 합니다.
-
감프
2022.06.03 11:30
귀한 답변 감사합니다.
실행계획에 나오는 비용은 통계 기반이기 때문에 실제 성능과 상이 할 수 있습니다.
서버에 CPU가 과부하라면 CPU가 적은것을 골라야 하고 아니면 I/O 기준과 수행시간 기준으로 고르시면 되지 않을까요
참고로 저는 SET STATISTICS TIME 보다는 Profilier나 XEVENT로 수집해서 보는걸 더 선호합니다.