시소당
SQL은 구사하는 방법과 기능에 따라 시스템의 전체 성능에 지대한 영향을 미칠 수 있으므로 SQL문을 작성
하기 전에 항상 튜닝된 SQL만 사용해야 한다. SQL을 작성한 후 프로그램에 내장하기 전에 항상 Execution Plan이 어떻게 전개되는가를 먼저 살펴보아야 한다.
SQL사용에 있어서 사례별로 올바른 방법을 가이드하기 위하여 작성된 것이다. 그러나 모든 사용 유형에 대해서는 정리 할 수 없기 때문에 일반적으로 잘못 사용되고 있는 유형에 대하여 가이드 하였고, 유형별로 나눌수 있는 것은 SQL사용 사례를 가지고 올바른 SQL사용법을 정리해 놓았다.
1. SQL 성능향상 가이드
 Or연산을 피한다.
어떤 경우 SQL문장에 Or연산자가 들어가면 인덱스를 사용하지 못하는 경우가 있다. 이런경우 두가지 방법으로 다시 SQL문장을 쓴다. 하나는 In연산자를 사용하는 방법이고, 하나는 Union연산자를 사용하는 방법이다.
SELECT a,거래분류코드, a.sum(전표매수), a.sum(건수), a.sum(금액)
FROM 조작자일별상세원장 a
WHERE a.국기호 = :입력국기호
AND a.거래일자 = :입력거래일자
AND a.조작자번호 = :입력조작자번호
AND ( a.과목코드 = ‘1’ or a.과목코드 = ‘2’)
GROUP BY a.거래분류코드;
<개선안1>
SELECT a,거래분류코드, a.sum(전표매수), a.sum(건수), a.sum(금액)
FROM 조작자일별상세원장 a
WHERE a.국기호 = :입력국기호
AND a.거래일자 = :입력거래일자
AND a.조작자번호 = :입력조작자번호
AND a.과목코드 IN (‘1’, ’2’)
AND GROUP BY a.거래분류코드;
<개선안2>
SELECT a,거래분류코드, a.sum(전표매수), a.sum(건수), a.sum(금액)
FROM 조작자일별상세원장 a
WHERE a.국기호 = :입력국기호
AND a.거래일자 = :입력거래일자
AND a.조작자번호 = :입력조작자번호
AND a.과목코드 = ‘1’
GROUP BY a.거래분류코드;
UNION ALL
SELECT a,거래분류코드, a.sum(전표매수), a.sum(건수), a.sum(금액)
FROM 조작자일별상세원장 a
WHERE a.국기호 = :입력국기호
AND a.거래일자 = :입력거래일자
AND a.조작자번호 = :입력조작자번호
AND a.과목코드 = ’2’
GROUP BY a.거래분류코드;
<개선안3>
Oracle7.2이상에서는 --+Use_Concat라는 힌트를 주면 Or를 해도 Full-Scan을 하지 않기 때문에 힌트를 사용하여 다음과 같이 나타낼 수 있다.
SELECT /*+ Use_Concat */ a,거래분류코드, a.sum(전표매수), a.sum(건수), a.sum(금액)
FROM 조작자일별상세원장 a
WHERE a.국기호 = :입력국기호
AND a.거래일자 = :입력거래일자
AND a.조작자번호 = :입력조작자번호
AND ( a.과목코드 = ‘1’ or a.과목코드 = ‘2’)
GROUP BY a.거래분류코드;