[MS-SQL Query] Count의 Case 부분 지연 관련 조언 요청드립니다. 0 4 618

by 아이스베어 [SQL Query] MS-SQL Qurey [2021.07.08 14:46:19]


시스로그를통해 로그인 실패 성공 관련  SQL 쿼리를 작성하고 있습니다.

근데 쿼리 지연이 엄청 심하네요...

조인한 테이블 은 3개이며

실제 메시지가 있는 테이블

메시지 아이디 와 장비 아이디가 있는테이블

장비 아이디 와 장비정보가 있는 테이블 로 구성되어있습니다.

쿼리 무게를 줄이고 싶은데 방법이 있을까요?

혹시 조언을 위해 추가로 필요한 정보가 있으시면 확인해서 올리도록 하겠습니다.

 

아래는 현재 사용하는 쿼리입니다.

 SELECT
C.[NodeID],
C.구분,
C.Reports_Group,
C.Caption,
C.장비관리자,
C.ip_address,
count(case 
        when A.Message like '%Accepted password for%'  then 1
        when A.Message like '%SEC_LOGIN-5-LOGIN_SUCCESS: Login Success%' then 1 
        when A.Message like '%SYS-LOGIN_OK-5: Sshd(vty0) is entered%' then 1  
        end)    as '로그인 성공',
count(case 
        when A.Message like '%Failed password for%' then 1
        when A.Message like '%SEC_LOGIN-4-LOGIN_FAILED: Login failed%' then 1
        when A.Message like '%SECURITY-5-AUTH-INCORRECT: FAILED%' then 1
        when A.Message like '%SYS-LOGIN_FAIL-5: Sshd(vty0) is entered%' then 1
        end)  as '로그인 실패'
From [SolarWindsOrionLog].[dbo].[OrionLog_LogEntryMessageView] A
left outer join [SolarWindsOrionLog].[dbo].[OrionLog_LogEntryView] B on A.LogEntryID = B.LogEntryID
left outer join [SolarWindsOrion].[dbo].[Nodes] C on B.NodeID=C.NodeID
where CONVERT(VARCHAR(10), B.MessageDateTime, 120) Between 
'2021-06-01' and '2021-06-30' 
AND A.Message is NOT NULL
and B.LogEntrySourceID = 2 	
 Group by C.NodeID, C.Caption, C.ip_address, C.구분,C.장비관리자,C.Reports_Group
 Order by C.Reports_Group asc    
by pajama [2021.07.08 18:06:47]

Where 조건에 convert함수를 써서 검색하면 풀스캔이 발생해서 느려질 가능성이 있을것 같습니다~


by 아이스베어 [2021.07.08 18:34:33]

기간조회할때 다른 함수가 있을까요?? 


by pajama [2021.07.08 21:17:28]

messagedatetime 컬럼은 datetime 형식, 인덱스가 있다고 가정하고 아래 쿼리들의 플랜을 보니 인덱스 스캔을 하네요~ 아마 날짜 컬럼이면 인덱스 있지 않을까요? 플랜 한번 비교해보세요~

select * from logtable where messagedatetime BETWEEN {ts '2021-07-01 00:00:00'} AND {ts '2021-07-31 23:59:59'};
select * from logtable where messagedatetime BETWEEN '2021-07-01 00:00:00' AND '2021-07-31 23:59:59';
select * from logtable where messagedatetime >= '2021-07-01 00:00:00' AND messagedatetime <= '2021-07-31 23:59:59';


by 마농 [2021.07.09 07:46:46]

where 절에서 b 에 대한 조건을 주고 있으므로 b 에 대한 아우터 조인은 의미가 없습니다.
그룹핑 기준이 c 이므로 c 에 대한 아우터 조인이 의미가 있을런지?
습관적으로 아우터 조인을 사용하는 것은 아닌지?
1. 각 테이블에 적절한 인덱스가 존재하는지?
2. 컬럼을 가공하여 조건주지 말고 컬럼은 그대로 둔 채 조건을 가공하여 비교
3. 쿼리에 불필요한 부분은 없는지 확인. (예 : 아우터 조인)

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입