엄범

 

 

서브 쿼리는 일반적으로 지양하는 편이 좋다

  • 스칼라 서브쿼리는 리턴되는 건수마다 결과를 수행하기 때문에 대량의 결과가 리턴되는 쿼리에서는 성능이 몹시 떨어진다.
    • 스칼라 서브쿼리란? subquery 위치에 따라서 다음과 같이 부른다.
      • SELECT 절에 있는 서브쿼리 : 스칼라 서브쿼리
      • FROM 절에 있는 서브쿼리 : 인라인 뷰
      • WHERE 절에 있는 서브쿼리 : 서브쿼리
    • 상황에 따라 이를 OUTER JOIN 등으로 변경할 수 있다.

 

 

실행 계획 (PLAN) 보기

Query는 비절차형 언어이기 때문에, 원하는 결과를 얻기 위한 시스템의 동작을 개발자가 하나하나 지정하는게 아니라

DBMS에게 Query를 주면 알아서 실행하고 결과를 돌려준다.

 

내가 넘긴 Query를 DBMS가 어떤 식으로 해석하고 실행할 것인가?를 의미하는 것이 "실행 계획" 이다.

 

Query 최적화 할 때 주로 확인한다. 어... 이거 좀 느릴 것 같은데? 생각 들면 플랜을 한 번 보는게 좋다.

 

오라클의 경우 예상 실행 계획을 확인하는 구문은 다음과 같다.

보통 SQL gateway 같은 툴에는 Query Plan을 볼 수 있는 단축키 (F6) 같은 것이 존재한다.
예상 실행 계획이므로 Bytes, Cost가 더 낮다고 해서 무조건 더 좋은 쿼리라고 할 수는 없다.
실제 수행 결과에 대한 비용은 다를 수 있음. 단건 조회냐, 대량 조회냐에 따라서도 결과가 다를 수 있고.

 

```sql

EXPLAIN PLAN FOR
SELECT * FROM SMPL_CARD;

 

SELECT * FROM TABLE(dbms_xplan.display);

```

결과에 출력되는 Plan hash value가 같으면, 두 쿼리의 플랜이 동일하다는 의미다.

 

TID같은 Primary Key column에 날짜를 Prefix로 붙이면 좋은 점

tid같은 String도 >= 비교가 가능하므로,

DB에서 날짜로 기간 검색 시, index가 걸려있는 key 컬럼을 BETWEEN 등으로 걸어서 사용할 수 있으므로

인덱스를 활용할 수 있음.

이게 없으면 인덱스 없는 상태로 풀스캔 하거나, 날짜 컬럼에도 index를 걸어야 한다.

 

조인 검색 시 양쪽 테이블 모두 범위를 줄여줄 수 있다면(ex, 날짜, index column) 각각 줄여주는 것이 좋다.