ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ORACLE] SELECT가 너무 느리다면 일단 이걸 확인해보기
    IT/코딩히스토리_DB 2025. 1. 20. 23:35

    데이터를 주고 받는 경우가 많아서 매월, 당월에 발생한 데이터를 추출한다.

    그런데 데이터가 너무 많이 쌓여서 SELECT가 10분이 넘어도 끝나지 않았다.

    보통 쿼리 실행계획을 EXPLAIN PLAN을 통해서 확인을 한다는데 

    해당 쿼리가 다른 DB에서 링크로 여러 테이블을 가져와 조인하는 등 복잡해서 

    실행계획을 보는게 더 힘들었다.

    그래서 안에 있는 쿼리부터 차근차근 확인해봤다.

     

    보통 이럴때 약간만 수정해도 쿼리 속도가 현저하게 빨라졌던 경험이 있어서

    이번에도 똑같이 진행해봤는데

    10분이 넘어도 실행안되던게 

    1분안에 결과문이 나왔다.

     

    이런 경우는 아래 3가지를 확인한다.

    1) IN 사용을 되도록 안하기

    2) 서브쿼리가 꼭필요한가? 데이터가 많다면 되도록 JOIN을 활용하기

    3) 인덱스가 없는 경우 전체 행이 작은 테이블로 조건을 걸기

     

    3번을 예로 들면 

     

    TABLE A의 전체 행이 10000개이고 TABLE B의 전체 행이 500개라면

     

    1. SELECT * FROM TABLEA A , TABLEB B 

    WHERE B.KEY = A.KEY AND B.KEY = 'A' 

    2. SELECT * FROM TABLEA A , TABLEB B 

    WHERE B.KEY = A.KEY AND A.KEY = 'A'

     

    1번 쿼리가 2번 쿼리보다 빠르단 것 

     

    요약
    SELECT * 
    FROM TABLEA  A, TABLEB B 
    WHERE B.KEY = A.KEY 
      AND B.KEY = 'A';
    [순서]
    조건 B.KEY = 'A'가 TABLEB에 먼저 적용됩니다.
    TABLEB의 행 수가 적으므로(500개), B.KEY에 적절한 인덱스가 있다면 이 조건으로 매우 빠르게 대상 행을 필터링할 수 있습니다.
    이후 A.KEY = B.KEY 조인이 수행됩니다. 

    TABLE A에서 일치하는 행을 찾기 위해 추가적으로 작업이 필요합니다.

    SELECT * 
    FROM TABLEA  A, TABLEB B 
    WHERE B.KEY = A.KEY 
      AND A.KEY = 'A';

    [순서]
    조건 A.KEY = 'A'가 TABLEA에 먼저 적용됩니다.
    TABLE A는 행 수가 더 많으므로(10,000개),

    A.KEY에 적절한 인덱스가 없다면 상대적으로 더 많은 작업을 수행해야 합니다.
    이후 B.KEY = A.KEY 조인이 수행됩니다.

     

     

     

     

    (많이 부족합니다. 그냥 간단한 튜닝으로도 속도가 빨라졌던 저의 경험을 적어봤습니다.)

Designed by Tistory.