본문 바로가기
카테고리 없음

효율적인 SQL 작성 TIP

by akasha.park 2023. 11. 26.

효율적인 SQL   작성 TIP

SQL을 작성하기 전에 테이블간의 연관 관계, 테이블의 크기, 인덱스의 구성 컬럼과 정렬 순서 등을 충분히 이해해야 합니다.
SQL은 데이터 I/O, 데이터 정렬 작업, 서버와 클라이언트 사이의 통신량 등이 적을수록 효율적입니다


인덱스를 구성하는 컬럼이 여러 개인 경우에는 매칭 컬럼의 개수가 많아지도록 조건식을 변형하면 인덱스를 검색하는 구간이 좁아지므로 성능적으로 유리합니다

 


DB2은 비용 기반의 옵티마이저를 사용하므로 옵티마이저가 최적의 액세스 플랜을 결정할 수 있도록 최신 통계 자료를 유지하는 것도 매우 중요합니다

 

* 조회하려는 컬럼을 선택할 때에는 SELECT절에서 * (asterisk)을 지정하지 말고 필요한 컬럼만 정확하게 지정하는 것이 좋습니다.


* SELECT절과 COUNT 함수에서 * (asterisk) 사용하지 않기

 

어떤 조건에 해당하는 데이터의 존재 여부를 확인하기 위해 COUNT 함수를 사용하는 것은 좋은 방법이 아닙니다. 
상수를 이용한 SELECT문을 실행하고, 반환된 SQLSTATE 값으로 데이터의 존재 여부를 판별합니다. 
즉, 반환된 SQLSTATE가 '00000' 이면 해당하는 데이터가 있는 것이고, '02000' 이면 해당하는 데이터가 없는 것으로 판별되므로 NOT FOUND 핸들러를 이용해서 처리하면 됩니다. 
참고로, 조건에 해당하는 데이터가 2건 이상 존재하면 SQLSTATE가 '21000' 이 반환됩니다


불필요한 데이터 유형 변환, 연산식, 조건식 제거하기

 

 


* NOT 연산자와 != 을 이용한 부정형 조건식을 긍정형 조건식으로 변형하기


* 인덱스 컬럼의 값을 상수 또는 변수와 비교할 때 컬럼을 가공하는 연산식 대신에 비교되는 값을 가공하도록 합니다.

 

 

 

비교하는 값이 복잡한 연산식이라면 연산식을 지정하는 것보다 연산식의 결과가 저장된 변수를 지정하는 것이 더 좋습니다

 

 

 

 


* 한 개의 조건식에서 여러 개의 컬럼을 비교하지 않기

조건식에서 지정된 컬럼들이 인덱스를 구성하는 컬럼이라면 여러 개의 조건식으로 분리하도록 합니다.


* 불필요한 정렬 작업을 유발하는 DISTINCT, ORDER BY, 집합 연산 제거하기

 


* 중복된 테이블 액세스는 제거하고, 필요한 레코드 건수만 조회하기


* 커서 정의시 FOR UPDATE 옵션 활용하기
* 프로시저와 함수 등에서 SQL문의 개수 줄이기