반응형

SQL 쿼리를 짤 때 주의해야 하는 것들


1. WHERE 조건절 걸 때, INDEX 순서에 맞게 거는게 좋다.
- 각 DBMS에서는 SQL 쿼리의 옵티마이저가 실행이 되는데, 이 옵티마이저가 인덱스와 조건절을 비교하여 성능이 좋은 것들을 우선적으로 사용하여 조회를 한다. 그렇기 때문에, 제일 먼저 인덱스가 실행되는 순서대로 WHERE 조건절을 짜게 되면 실행 속도가 줄어든다.

 


2. SQL 쿼리에서 풀스캔이 있는지 없는지 확인한다.

- SQL 실행 속도를 현저하게 비효율적으로 만드는 것이 풀스캔이다. 데이터가 적은 경우에는 치명적인 것은 없겠지만, 데이터의 수가 100만건, 1000만건 등 데이터가 많아지면 풀스캔은 치명적으로 작동하고, out of memory가 발생하거나, DB 서버가 죽어버린다. 그렇기에, 풀스캔이 있는지 없는지 확인해야 한다.

 

- SQL 쿼리가 풀스캔이 있는지 없는지 확인을 하려면 SQL 쿼리의 실행계획을 봐야 한다. TIbero Studio인 경우에는 쿼리에 대해 F7을 누르면 SQL 쿼리의 실행계획을 실행할 수 있다. 그러면, 이 실행계획에 따라 풀스캔인 경우 파란색의 글자로 나타난다. 이 경우, 풀스캔을 하지 않도록 where 절에 조건을 설정하는 등을 통해 풀스캔을 해결한다.

 

 

3. LIKE를 사용할 때 데이터에 대해 이해를 한 후에 사용해야 한다.

- LIKE를 넣을 때는 검색할 때 용이하다. 그런데, LIKE를 대용량 데이터가 있는 테이블에서 사용하게 된다면 치명적인 성능 저하를 야기한다. 예를 들어, 숫자나 문자에 따라 앞 뒤에 %% 를 동시에 넣게 되면(%문자열%), 문자열을 포함하고 있는 모든 데이터를 조회해올 수 있다.(풀스캔) 거기에, LIKE를 넣게 되면 Index가 먹히지 않는 경우가 생기기도 하니 주의해서 사용해야 한다.

 

- 여기서, LIKE는 '문자열%' 를 사용하면 성능을 크게 떨어뜨리지 않고 사용할 수 있지만, '%문자열%', '%문자열' 이 경우에는 풀스캔이 되는 경우가 있으니 주의해서 사용해야 한다.

 

4. Driving Table을 정한 후에 사용해야 한다.

2번과 비슷한 이야기지만, 1000만 개의 데이터가 있는 테이블 A와 300만 개의 데이터가 있는 테이블 B가 있을 때, 300만 개의 데이터가 있는 테이블을 먼저 첫 스타트를 해야 쿼리 속도가 개선이 된다. 예를 들어, 아래와 같이 사용을 해야 한다.

 

아래의 쿼리를 보면, 300만 개의 데이터가 있는 테이블 B를 첫 스타트로 가져와서 1000만 개의 데이터가 있는 A테이블을 INNER JOIN을 하게 되면, 300만 개의 데이터 수만큼 테이블 탐색을 한다.

SELECT *
  FROM B
INNER JOIN A ON B.ID = A.ID

 


2022년 7월 7일 v1.0 작성

2022년 8월 4일 v1.1 작성

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기