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
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';