단순 Select 쿼리가 너무느린데 조언좀 부탁드립니다 ..ㅠㅠ 0 7 163

by 꿈꾸는개발자 [MySQL] [2018.08.08 16:14:13]


	SELECT 
		    A.LOGIN_SESSION_ID,	
		    A.USER_NAME, 		
		    A.USER_IP, 			
		    A.SERVER_IP,		
		    A.ACTION_DATE,	
		    B.ACTION_DATE,	
		    B.ACTION,	
		    A.LOGIN_LOG_ID
		FROM 
		    (SELECT 
		        USER_NAME, 		
		        USER_IP, 		
		        ACTION_DATE,	
		        ACTION,		
		        LOGIN_SESSION_ID,
		        LOGIN_LOG_ID,
		        SERVER_IP
		    FROM 
		        LOGIN_LOG
		    WHERE ACTION = 'Login'
			) A	    
		    LEFT JOIN 
		        (SELECT 
		            USER_NAME, 		
		            USER_IP, 		
		            ACTION_DATE,	
		            ACTION, 		
		            LOGIN_SESSION_ID
		        FROM 
		            LOGIN_LOG
		        WHERE ACTION = 'LogOut'
		        OR ACTION = 'TimeOut') B
		        ON B.LOGIN_SESSION_ID = A.LOGIN_SESSION_ID
		ORDER BY 
			A.LOGIN_LOG_ID DESC		

안녕하세요.

다음과같이 Login Log를 남기고 있는 테이블에서, 셀프 조인을해서 조회페이지에서 제공을 하는데.

셀프조인을 하면 데이터가 7만건인데 이 조인쿼리 속도가 거의 30~40초를 넘어갑니다.

어떻게 튜닝을 할 수있을까요?

 

제가 생각한방법은 조인하기전에 정렬을 한뒤에 조인을 하는거였는데 left 조인을 하니 섞여버리네요...

 

조언좀 부탁드리겠습니다.

 

(따로 키등록은 안하고 primary key가 autoincremnet 인 LOGIN_SESSION_ID 컬럼입니다.)

DB는 마리아디비입니다.

by 우리집아찌 [2018.08.08 16:23:55]

결과값이 원하시는게 나오는게 맞나요?

 


by 꿈꾸는개발자 [2018.08.08 16:34:35]

우리집아찌 // 네 결과갑 자체는 제가 원하는게 맞습니다.

 

select 문을 치면 아래와 같이 나옵니다.

---------------------------------------------------------------------------

로그인로그ID(AUTOINCREMENT값) 유저네임   클라이언트IP  서버IP        로그인한시각          로그아웃시각(없음NULL) 

123                                          user         110.11.11.2    11.11.11.11  2018/08/07 14:00    2018/08/07 16:00

123                                          user2         110.11.11.2    11.11.11.11 2018/08/09 14:00    null

 

--------------------------------------

 

이상하다고 생각한 곳이있으신지요?ㅠㅠ

 


by 아발란체 [2018.08.08 16:37:42]

따로 인덱스 잡지 않으시고 Primary key만 있다고 하면 서브쿼리 안에서 조건절 풀스캔 타지 않을까요?


by 꿈꾸는개발자 [2018.08.08 16:40:42]

아발란체// 아 제가 초보라서, 같은 쿼리라도 oracle sql에서 쿼리태우면 엄청빠르던데. 그럼 저 테이블기준으로는 id로 키를 또한번 잡으면 될까요?


by 마농 [2018.08.08 17:50:08]

쿼리가 설명과 다릅니다.
LOGIN_SESSION_ID 가 키라고 했는데요?
그렇다면? A 와 B  의 조인이 성립한다는 얘기는
LOGIN_SESSION_ID 가 키가 아니라는 것입니다.
LOGIN_SESSION_ID 가 키라면 조인이 성립되지 않습니다.
LOGIN_SESSION_ID 가 키라면 테이블에 LOGIN_SESSION_ID 가 유일할텐데
동일 테이블에서 유일키에 대해 다른 엑션값을 갖는 행이 여러개라는게 말이 안되죠.
테이블에 대한 키 정보와, 인덱스 정보가 필요해 보입니다.


by 마농 [2018.08.08 17:53:44]

같은 LOGIN_SESSION_ID 가 시간별로 여러번 로그인 로그아웃 할 수 있을 것 같은데요?
그런데 시간에 대한 조건이 없이 로그인과 로그아웃을 셀프조인하면
엄청난 카티션프러덕트가 발생됩니다.
한 ID 가 10번 로그인하고 10번 로그아웃했으면
조인하면 100건으로 뻥튀기가 됩니다.


by 마농 [2018.08.09 11:41:19]
SELECT login_session_id
     , user_name
     , user_ip
     , server_ip
     , MIN(CASE WHEN action  = 'Login' THEN action_date  END) Login_Date
     , MIN(CASE WHEN action != 'Login' THEN action_date  END) LogOut_Date
     , MIN(CASE WHEN action != 'Login' THEN action       END) LogOut_Action
     , MIN(CASE WHEN action  = 'Login' THEN login_log_id END) Login_Log_ID
  FROM login_log
 WHERE action IN ('Login', 'LogOut', 'TimeOut')
 GROUP BY login_session_id, user_name, user_ip, server_ip
 ORDER BY Login_Log_ID DESC
;

 

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