Вы находитесь на странице: 1из 16

SQL 가이드

국가대표포털 2단계 구축 통합사업

문서번호 : MOP_COM_정의_030

Version 0.9
개발 표준 정의서 (SQL 가이드)
국가대표포털 2단계 구축 통합사업
문서번호 : MOP_COM_정의_030 작성일자 : 2010-07-20

제/개정 이력

0.9 QA 검토 사항 반영 황준경 2010-08-19


0.1 최초 작성 이가혜 2010-07-20
개정번호 제,개정 페이지 및 내용 작성자 제,개정 일자

Page 2
개발 표준 정의서 (SQL 가이드)
국가대표포털 2단계 구축 통합사업
문서번호 : MOP_COM_정의_030 작성일자 : 2010-07-20

목 차

1. SQL 작성 표준........................................................................................................................................................4
1.1. 대소문자 구분...................................................................................................................................................4
1.2. 라인 변경...........................................................................................................................................................4
1.2.1. 라인변경 원칙.............................................................................................................................................4
1.2.2. 괄호..............................................................................................................................................................5
1.2.3. 그밖에 복잡한 구문....................................................................................................................................6
1.3. 들여쓰기.............................................................................................................................................................6
1.3.1. SELECT........................................................................................................................................................6
1.3.2. UPDATE/DELETE.......................................................................................................................................8
1.3.3. INSERT.........................................................................................................................................................8
1.4. 주석.....................................................................................................................................................................9
2. SQL 구문 작성 지침.............................................................................................................................................10
2.1. SQL 구문 작성시 준수사항...........................................................................................................................10
2.2. 그 밖의 고려 사항...........................................................................................................................................11
3. SQL 구문 작성시 유의사항.................................................................................................................................12
3.1. 인덱스 컬럼에 변형........................................................................................................................................12
3.2. 부정형 NOT OPERATOR를 사용한 경우............................................................................................................12
3.3. NULL, NOT NULL..........................................................................................................................................13
3.3.1. NULL.........................................................................................................................................................13
3.3.2. NOT NULL.................................................................................................................................................13
3.4. 존재 여부를 검사하는 경우...........................................................................................................................13
3.5. ORDER BY와 LIMIT을 함께 사용 하는 경우.............................................................................................14
3.5.1. INDEX가 없는 경우..................................................................................................................................14
3.5.2. INDEX가 존재하는 경우..........................................................................................................................15

Page 3
개발 표준 정의서 (SQL 가이드)
국가대표포털 2단계 구축 통합사업
문서번호 : MOP_COM_정의_030 작성일자 : 2010-07-20

1. SQL 작성 표준
 SQL 예약어와 함수는 대문자로 작성
 예약어와 함수를 제외한 SQL문의 컬럼명 , 변수 , 테이블 명 , 조건 등은 소문자로 작성
 SELECT, FROM, WHERE, GROUP BY, HAVING, INTO, SET, AND 등 구문이 나뉠 경우 라인 변

 SELECT 절의 조회 컬럼이나 FROM 절의 테이블은 한 줄에 하나만 작성하고 라인 변경
 주석 사용시 : /* */ 만을 사용하며 , 해당 업무명 , 작성자 , 작성일을 SQL 첫 줄에 적는다 .
 주석은 SQL문 시작 전 제일 첫 줄에 , 힌트는 SELECT 다음에 위치한다 .
 WHERE 조건절에서 의도적으로 인덱스용을 위해 컬럼을 변형하거나 “ ||” 사용시 주석으로 사
항을 적는다 .
 OUTER JOIN, UNION 등 복잡한 SQL일 경우 , 주석으로 설명을 적는 것을 권고한다 .

1.1. 대소문자 구분
SQL 구문의 예약어와 함수는 대문자로 작성한다 . SQL 문의 예약어와 함수를 제외한 컬럼명 , 변수 , 테
이블 명 , 조건 등은 소문자로 작성한다

Ex)
/* 주석 ( 업무 , 작성자 , 작성일 ) */

SELECT /*+ 힌트 */

deptno,

COUNT(*)

FROM emp

WHERE job = ‘CLERK’

GROUP BY deptno;

1.2. 라인 변경
1.2.1. 라인변경 원칙
SELECT, FROM, WHERE, GROUP BY, HAVING, INTO, SET, AND 등과 같은 예약어에 의해서 SQL 구
문이 나눠지는 경우 라인들을 변경한다 . 또한 , SELECT 의 조회 컬럼이나 FROM 절의 테이블은 한줄에
하나만 작성하고 라인을 변경한다 . 조회 컬럼이나 테이블의 구분을 위해 콤마 (,) 는 각 라인별 마지막에 둔
다.

Page 4
개발 표준 정의서 (SQL 가이드)
국가대표포털 2단계 구축 통합사업
문서번호 : MOP_COM_정의_030 작성일자 : 2010-07-20

Ex)
/* 주석 ( 업무 , 작성자 , 작성일 ) */

SELECT /*+ 힌트 */

deptno,

DECODE(job, ‘CLERK’, ‘CLERK_MANAGER’, ‘’) svc_cd,

SUM(comm) comm,

SUM(sal) sal

FROM dept d

INNER JOIN emp e

ON d.deptno = e.deptno

WHERE e.sal > 500

GROUP BY deptno

1.2.2. 괄호
인라인뷰나 스칼라 서브쿼리 등을 사용할 경우 괄호안의 구문도 작성표준을 준수하여 작성하며 , 다만 한
라인이 길어져서 가독성이 떨어지게 되는 경우 개발자의 판단으로 적절히 라인을 변경하여 가독성을 높이도
록 한다 .

Ex1)
… f.unpay_pass,

FROM dept d

INNER JOIN (SELECT deptno,

SUM(sal)

FROM emp

GROUP BY deptno) e

ON d.deptno = e.deptno

Ex2) /* 주석 ( 업무 , 작성자 , 작성일 ) */

SELECT /*+ 힌트 */

deptno,

dname

FROM dept

WHERE deptno IN (SELECT deptno

FROM emp

WHERE empno= ‘1111’)

Page 5
개발 표준 정의서 (SQL 가이드)
국가대표포털 2단계 구축 통합사업
문서번호 : MOP_COM_정의_030 작성일자 : 2010-07-20

1.2.3. 그밖에 복잡한 구문


DECODE 나 CASE 문 작성시 구문이 길어져 가독성이 떨어질 경우 추가적으로 라인을 변경하거나 스페이
스를 추가하여 가독성을 향상시킨다

Ex)
/* 주석 ( 업무 , 작성자 , 작성일 ) */

SELECT /*+ 힌트 */

DECODE (deptno, ‘10’, ’ACCOUNTING’, ‘’) deptno,

CASE WHEN LENGTH(comm) >9 THEN ‘*********’

WHEN LENGTH(comm) <= 9 THEN TO_CHAR(comm)

END comm

FROM emp;

1.3. 들여쓰기
1.3.1. SELECT
SELECT 의 들여쓰기는 SELECT 를 기준으로 FROM, WHERE, INTO 등의 끝 문자를 맞춘다 . 단
GROUP BY 나 ORDER BY 는 BY 이전 스페이스 1 칸을 띄우고 관련 내용을 기술하며 INNER JOIN
은 INNER 이후 스페이스 1 칸을 띄우고 내용을 기술한다 .

Page 6
개발 표준 정의서 (SQL 가이드)
국가대표포털 2단계 구축 통합사업
문서번호 : MOP_COM_정의_030 작성일자 : 2010-07-20

Ex)
/* 주석 ( 업무 , 작성자 , 작성일 ) */

SELECT /*+ 힌트 */

deptno,

DECODE(job, ‘CLERK’, ‘CLERK_MANAGER’, ‘’) svc_cd,

SUM(comm) comm,

SUM(sal) sal

FROM dept d

INNER JOIN emp e

ON d.deptno = e.deptno

WHERE e.sal > 500

GROUP BY deptno

ORDER BY dname;

Page 7
개발 표준 정의서 (SQL 가이드)
국가대표포털 2단계 구축 통합사업
문서번호 : MOP_COM_정의_030 작성일자 : 2010-07-20

1.3.2. UPDATE/DELETE
UPDATE, DELET 문을 기준으로 SET, FROM, WHERE 등의 끝문자를 맞춘다 . 컬럼 구분은 가장 길이가
긴 컬럼의 콤마 (,) 나 등호 (=) 를 기준으로 맞춘다 . Tab 키는 사용하지 않는다 .

Ex1)
/* 주석 ( 업무 , 작성자 , 작성일 ) */

UPDATE emp

SET sal = 7000

WHERE empno = 1111;

Ex2)
/* 주석 ( 업무 , 작성자 , 작성일 ) */

DELETE emp

WHERE deptno = 10

AND job = ‘CLERK’;

1.3.3. INSERT
한 라인당 하나의 컬럼을 배치할 수 있다 .

Ex)
/* 주석 ( 업무 , 작성자 , 작성일 ) */

INSERT

INTO emp

( empno,

ename,

job,

mgr,

hiredate,

sal,

comm,

deptno )

VALUES ( 1112,

‘GHLEE’,

Page 8
개발 표준 정의서 (SQL 가이드)
국가대표포털 2단계 구축 통합사업
문서번호 : MOP_COM_정의_030 작성일자 : 2010-07-20

‘DBA’,

1111,

20100630,

1000,

0,

10)

1.4. 주석
/* */ 형태 주석만을 사용하며 , 실행되는 모든 SQL 문에는 해당 업무명 , 작성자 , 작성일을 주석에 적
는다 . 이는 DB 에서 실행되는 SQL문만을 보고 해당 SQL문이 실행된 프로그램을 파악하기 위해서이다 .
WHERE 조건절에서 의도적으로 인덱스용을 위해 컬럼을 변형하거나 “ ||” 사용시 주석사항을 적는다 .
OUTER JOIN, UNION 등 복잡한 SQL일 경우 , 주석으로 설명을 적는 것을 권고한다 .

Ex)
/* 홍보서비스 콘텐츠 조회 , 홍길동 , 2010.07.12 */

SELECT /*+ INDEX(table 명 index 명 ) */

empno,

ename

FROM emp

WHERE hire_date LIKE ‘2010%’

AND deptno = 10;

Page 9
개발 표준 정의서 (SQL 가이드)
국가대표포털 2단계 구축 통합사업
문서번호 : MOP_COM_정의_030 작성일자 : 2010-07-20

2. SQL 구문 작성 지침
 SQL 구문을 제 3 자가 이해하기 쉽도록 작성표준을 준수하여 작성한다 .
 SQL 구문의 표현 형식 ( 대소문자 구분 , 변수 선언 , 들여쓰기 , 주석 처리 등 ) 은 반드시 작
성 표준을 준수하여 가독성을 높인다 .
 WHERE 구문에서 사용되는 Host 변수 명은 개발 표준의 명명 규칙에 따른다 .
 SQL 언어를 정확히 이해하고 작성해야 한다 .
 INLINE VIEW 를 적절히 활용하여 조인횟수를 줄이거나 SQL 호출 횟수를 줄일 수 있으나 ,
SQL 구문 이해를 돕기 위하여 가급적 복잡한 IN-LINE VIEW 의 사용은 최소화 한다 .
 불필요한 DUAL 테이블의 사용은 자제한다 .
 처리 결과값이 항상 Unique 한 경우 DISTINCT 키워드를 사용하지 않는다 .
 WHERE 절 구문에 있는 인덱스 컬럼에 대하여 인위적으로 변형하지 않는다 .
 가급적 부정형 조건보다 긍정형 조건을 사용하도록 한다 .
 서로 다른 데이터 타입의 컬럼 비교시 DBMS가 내부 변형을 발생 시키므로 주의한다 .
 조인의 연결고리 역할을 하는 컬럼은 동일한 데이터 타입을 사용한다 .

2.1. SQL 구문 작성시 준수사항


 반드시 PLAN 을 활용한다 .
- Optimizer 가 어떤 데이터 접근경로를 선택하는지 확인할 수 있다 .
- SQL 단위 EXPLAIN 결과를 아래와 같은 Query 를 이용하여 확인한다 .

ALTER SESSION SET EXPLAIN PLAN = ON;


ALTER SESSION SET EXPLAIN PLAN = ONLY;

 SELECT 될 데이터 건수를 최소화 한다 .


- 특히 OLTP 인 경우 한 트랜잭션에서는 화면에서 출력할 정보에 해당하는 데이터만 추출한다 .
- I/O, CPU 효율화 측면에서 매우 뚜렷한 효과를 갖는다 .
- 최상의 데이터 접근경로를 갖더라도 실제적으로 검색조건을 만족하는 데이터 건수가 많다면
빠른 처리속도를 기대할 수 없다 .
 SELECT * 를 사용하지 않는다 .
- 프로그램과 데이터베이스 간의 독립성을 유지하기 위함이다 .
- Table 에 column 하나가 추가될 경우 SELECT * 을 사용한 모든 프로그램의 수정이 발생한
다.
 DISTINCT 사용을 줄인다 .
- 중복된 값을 찾기 위해 DBMS가 내부적으로 sort 를 한다 .

Page 10
개발 표준 정의서 (SQL 가이드)
국가대표포털 2단계 구축 통합사업
문서번호 : MOP_COM_정의_030 작성일자 : 2010-07-20

- 프로그램에서 중복된 값을 무시하거나 제거하는 게 좋다 .


2.2. 그 밖의 고려 사항
 INDEX COLUMN 을 검색조건으로 사용한다 .
 COMPOSITE INDEX( 결함 INDEX) 를 활용한다 .
- 검색조건의 COLUMN 과 INDEX 의 COLUMN 순서는 매우 중요하다 .
- 검색 조건의 COLUMN 이 INDEX 의 앞에 있는 COLUMN 들과 일치 할 때 INDEX
MATCHING SCAN 이라고 하며 MATCHING COLUMN수가 INDEX COLUMN 수에 가까울수록 SQL의
효율이 좋아진다 .
 반드시 필요할 때만 ORDER BY 한다 .
- SORT 되는 COLUMN 을 제한하는 것이 좋다 .
- 자주 SORT 되는 COLUMN 은 INDEX 를 지정하는 것을 고려한다 .
 검색 조건에서 비교되는 COLUMN, 변수는 동일한 DATA TYPE 이어야 한다 .
- DATA CONVERSION 이 발생하면 INDEX 사용이 불가능하다 .
 범위가 적다면 “ LIKE”, “BETWEEN AND” 보다 IN 을 사용한다 .
- IN 은 = OR 문장으로 해석된다 .
 UNION 보다 UNION ALL 을 사용하여 SORT 를 방지한다 .
 특별한 이유 없이 절대로 JOIN 조건 없이 ( 카티시안 곱 ) 실행하지 않는다 .
- JOIN 조건 없이 두 개 이상의 TABLE 로부터 SELECT 를 하게 되면 , 두 TABLE 의 건
수를 곱한 만큼의 DATA 를 가져온다 .
- DATA 량이 많은 경우 부주의한 JOIN 은 시스템 전체의 CPU 에도 영향을 미치게 된다 .

Page 11
개발 표준 정의서 (SQL 가이드)
국가대표포털 2단계 구축 통합사업
문서번호 : MOP_COM_정의_030 작성일자 : 2010-07-20

3. SQL 구문 작성시 유의사항


3.1. 인덱스 컬럼에 변형
 수식이나 기타 함수를 사용하여 인덱스 컬럼에 변형이 생긴 경우 , 반드시 함수나 수식을 사용하는
경우에는 INDEX COLUMN 에 적용하면 인덱스를 사용할 수 없게 된다 .
- WHERE TO_CHAR(hire_date, ‘YYYYMMDD’) = ‘20100630’ (X)
 WHERE hire_date = TO_DATE(‘20100630’, ‘YYYYMMDD’) (O)
- WHERE sal * 30 >30000 (X)
 WHERE sal > 1000 (O)
 비교 컬럼의 데이터 타입이 다른 경우
- WHERE fg_type = 10 (fg_type 의 데이터 타입이 문자형인 경우 )
 WHERE fg_type = ‘10’

‘fg_type’이 CHAR 형인데 NUMBER 형을 직접 대입하게 되면 WHERE TO_NUMBER(fg_type)


= 10 으로 기술된 것과 똑 같은 효과, 즉 index column 을 변형한 것과 같다. 따라서 상수 절을
변형시켜 주어야 한다

 NUMBER 형 컬럼을 LIKE 로 비교한 경우


- WHERE cd_no LIKE ‘10%’ (cd_no 의 데이터타입이 NUMBER 형인 경우 )

cd_no’가 NUMBER형으로 index가 만들어져 있고, 조건문에서 10%으로 비교되므로 WHERE


TO_CHAR(cd_no) LIKE ‘10%’ 으로 변형되어 INDEX를 사용할 수 없게 된다. 따라서 다양한 조건
이 요구되는 업무에서 반드시 ‘=’ 조건으로만 사용되는 경우는 드물기 때문에 INDEX의 설정이 예상
되는 COLUMN은 문자형으로 설정하는 것을 권고한다

 Wildcard 로 시작되는 문자열 LIKE 비교


- 이 경우에는 INDEX 를 FULL SCAN 하게 된다 . 일반적으로 RANGE SCAN 보다 효율
이 저하된다 .

WHERE 주소 LIKE ‘%광화문’

3.2. 부정형 NOT operator 를 사용한 경우


 NOT Operator를 사용하게 되면 인덱스를 사용할 수 없다 .

Page 12
개발 표준 정의서 (SQL 가이드)
국가대표포털 2단계 구축 통합사업
문서번호 : MOP_COM_정의_030 작성일자 : 2010-07-20

Ex)
/* 주석 ( 업무 , 작성자 , 작성일 , DBIO ID) */

SELECT /*+ 힌트 */

a.deptno,

a.deptname

FROM emp a

WHERE a.job <> ‘sales’

3.3. NULL, NOT NULL


3.3.1. NULL
기본적으로 인덱스를 구성한 column 값이 전부 NULL 이라면 INDEX 는 이런 값을 저장하지 않는다 .
따라서 NULL 인 값이 많지 않은 값을 INDEX 를 통해 액세스를 하고자 한다면 데이터 생성시 디폴트로
0 과 같이 데이터를 만들어 주도록 하고 , SQL 은 다음과 같이 수정하면 유리하다 .
 WHERE comm IS NULL => WHERE comm = 0
3.3.2. NOT NULL
반대로 , 만약 대부분의 값이 NULL 이고 NOT NULL 인 경우가 검색 대상이라면 해당 COLUMN 을
NULL 허용 설정하고 INDEX 컬럼으로 선정하는 것이 좋다 . 이유는 INDEX 에는 NULL 인 값은 저장
하지 않기 때문에 보다 빠른 검색이 가능하다 .

3.4. 존재 여부를 검사하는 경우


데이터의 존재 여부를 검사하는 경우 , count(*) 을 사용하면 안된다 .

(X) (O)
SELECT /*+ ... */ ...

count(*) v_cnt = 0;

INTO :v_cnt SELECT /*+ ... */

FROM EMP 1

WHERE DEPT_NO = :v_Dept_No; INTO :v_cnt

if (v_cnt < 1) return; FROM EMP

... WHERE DEPT_NO = :v_Dept_No

// v_cnt 가 0 보다 큰 경우에 작업을 진행한다 . LIMIT 1;

if (v_cnt < 1) return;

...

Page 13
개발 표준 정의서 (SQL 가이드)
국가대표포털 2단계 구축 통합사업
문서번호 : MOP_COM_정의_030 작성일자 : 2010-07-20

3.5. ORDER BY 와 LIMIT 을 함께 사용 하는 경우


정렬한 결과에서 상위 10 개를 추출하는 Query 사용시에는 Index 를 이용할 수 있는 경우 INDEX 의
정렬을 이용하여 ORDER BY 를 대체한다 .
3.5.1. INDEX 가 없는 경우

Ex)
//1000 개의 ROW 를 가지는 T 테이블 생성

CREATE TABLE t

AS

SELECT LEVEL col1,

MODE(LEVEL, 10) col2


FROM dual

CONNECT BY LEVEL <= 1000;

//col2 로 정렬하여 2 개만을 추출

SELECT ROWNUM rn, col1, col2

FROM t

ORDER BY col2

LIMIT 2;

RN COL1 COL2

-------------------------------------------------------------------

20 20 0

10 10 0

2 rows selected.

------------------------------------------------------------

PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 24 )

LIMIT-SORT ( ITEM_SIZE: 24, ITEM_COUNT: 1000, STORE_COUNT: 2, ACCESS: 2, SELF_ID: 2, REF_ID:

0)

COUNTER

SCAN ( TABLE: T, FULL SCAN, ACCESS: 1000, SELF_ID: 0 )

------------------------------------------------------------

-- Full Table Scan 이후 , 2 건만 추출 . Rownum 도 정렬되어 있지 않음

Page 14
개발 표준 정의서 (SQL 가이드)
국가대표포털 2단계 구축 통합사업
문서번호 : MOP_COM_정의_030 작성일자 : 2010-07-20

SELECT ROWNUM RN, COL1, COL2

FROM (SELECT COL1, COL2

FROM T

ORDER BY COL2)

LIMIT 2;

RN COL1 COL2

-------------------------------------------------------------------

1 20 0

2 10 0

2 rows selected.

------------------------------------------------------------

PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 24 )


COUNTER

VIEW ( ACCESS: 2, SELF_ID: 1 )

PROJECT ( COLUMN_COUNT: 2, TUPLE_SIZE: 16 )

LIMIT-SORT ( ITEM_SIZE: 16, ITEM_COUNT: 1000, STORE_COUNT: 2, ACCESS: 2, SELF_ID: 3,

REF_ID: 0 )

SCAN ( TABLE: T, FULL SCAN, ACCESS: 1000, SELF_ID: 0 )

------------------------------------------------------------

-- Full Table Scan 이후 , 2 건만 추출 . Rownum 은 Return 되는 순서대로 출력

3.5.2. INDEX 가 존재하는 경우

// 인덱스 생성
CREATE INDEX IDX_T_COL2 ON T(COL2);

SELECT ROWNUM rn,

col1,

col2

ORDER BY col2

LIMIT 2;

RN COL1 COL2

-------------------------------------------------------------------

Page 15
개발 표준 정의서 (SQL 가이드)
국가대표포털 2단계 구축 통합사업
문서번호 : MOP_COM_정의_030 작성일자 : 2010-07-20

1 820 0

2 830 0

2 rows selected.

------------------------------------------------------------

PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 24 )

COUNTER

SCAN ( TABLE: T, INDEX: IDX_T_COL2, ACCESS: 2, SELF_ID: 0 )

------------------------------------------------------------

Page 16

Вам также может понравиться