DBMS 2

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

성능 향상을 위한 SQL 가이드

DBMS 2
DB2 가이드
DB2 성능가이드
성능 향상을 위한 SQL 가이드
작성자
admin
작성일
2021-02-19 15:07
조회
2366

성능 향상을 위한 SQL 가이드

SQL 문장 I

데이터 타입과 길이를 같게 한다.

좀더 효과적인 값의 비교를 위해서는 호스트 변수와 컬럼의 타입과 길이를 같게 한다.

로컬 조건절을 사용한다.

데이터 베이스 매니저가 복잡한 Access Path의 단계별로 도출되는 행의 수를 제한함으로 조인시 우선적으로 Access 할 테이블을 결정한다.

서브쿼리와 동등한 문장인 경우는 조인을 사용한다.

조인의 경우, 다양한 access 방법이 가능함으로 서브 쿼리보다 성능이 뛰어나다.

UNION ALL 사용시 다음을 참고한다.

UNION ALL의 경우 중복되는 행을 제거하기 위한 정렬을 하지 않는다.
따라서 중복행이 허용되거나 다른 응용프로그램에 영향을 미치지 않는 한 UNION ALL을 사용하는 것이 좋다.

중복된 조건절은 주의하여 사용한다.

데이터를 필터링하는데 실제적으로 필요하지 않은 많은 조건절은 DB2 옵티마이저로 하여금 조인 과정에서 잘못된 테이블을 먼저 선택하게 할 수 있다.

필요한 컬럼만을 선택한다.

LOB 컬럼이나 Long varchar 컬럼등이 포함된 테이블의 컬럼을 모두 선택하는 것은 성능에 많은 영향을 끼치므로 고려해야 한다.


Index와 Table
  • 인덱스를 사용하면
    중복행을 방지할 수 있고 serach 성능을 향상시키며 Cardinality를 계산할 수 있다.
  • 클러스터링 인덱스를 사용하면 새롭게 추가되는 행이 제 위치에 정렬되어 들어간다.
  • 클러스터링 인덱스는 프라이머리 키에 명시하지 않는다
    한번 Primary Key가 만들어 지면 연관된 인덱스는 수정되지 않기 때문이다.
    따라서 Primary Key에 클러스터링 인덱스를 명시하고자 할때에는 인덱스를 만들 때 정의한다.
SQL 문장 II

For Read Only, For Fetch Only 문장을 명시한다

커서를 사용하여 만들어지는 결과 테이블에 대해 read only인지 여부를 명시하는 것이 좋다.

For Update Only 문장을 명시한다

실제로 update가 되는 컬럼에 대해서는 update only를 명시하여 dead-lock을 방지 함으로써 성 능을 향상시킨다.

불필요한 DISTINCT 또는 ORDER BY 문장은 사용하지 않는다.

DISTINCT나 ORDER BY는 정렬이 요구되는 작업으로 꼭 필요하지 않는 경우는 사용 하지 않는다.

테이블의 행 존재 여부를 확인을 위해 SELECT COUNT(*) FROM ~ 문장을 사용하지 않는다.

테이블이 큰 경우 얻고자 하는 행의 존재를 확인하기 위한 방법으로 SELECT COUNT(*) FROM
~ 을 사용하는 것은 성능에 막대한 영향을 끼친다.



  이러한 경우는 다음의 대체 방법을 사용한다.
SELECT 'Y' INTO :[varable Name] FROM t1 WHERE ….
실행후 SQLCODE가 0 →1 행
-811→2행 이상
100 →0행
이다.

자주 사용하지 않는 조회는 : 영구적인 뷰를 사용하는 대신 테이블 표현식을 사용한다.

좀더 개선된 SQL 문장 사용을 고려한다.

테이블 표현식
Common 테이블 표현식
Recursive SQL
Scalar Fullselect 등의 문장 사용을 고려한다.