어쩌다 주워 듣게 된 SQL 작성 표준을 적어둔다.
인터넷에 검색해보면 여러 표준이 나오는데,
거의 대부분이 같다.
존재 이유
어느 회사나 SQL 작성 표준 가이드가 존재하는데,
이러한 표준에 따른 형식화된 SQL 구문은
가독성을 높여서 구현 및 유지보수를 용이하게 한다.
SQL 구문 표준
1. SQL 구문은 가로 최대 길이가 80자 이하가 되도록 작성
튜닝 또는 유지보수를 용이하게 한다.
2. SQL 문의 대소문자에 대한 표준을 정하여 준수
예약어는 대문자, 개체명은 소문자 등으로 작성한다.
3. 구문을 구분하는 중요한 절은 항상 새로운 행에서 시작
SELECT, FROM, JOIN, WHERE 등과 같이
중요한 절은 새로운 행에서 시작한다.
4. 쌍(Pair)으로 구성된 구문은 줄을 정렬
BEGIN ~ END와 같이 쌍으로 구성된 구문의 줄을 맞추면
가독성 및 유지보수의 용이성과 더불어,
동일한 SQL에 대한 컴파일 비용을 줄일 수 있다.
5. 인덱스 구성 컬럼 가공 금지
조건절에서 인덱스 구성 컬럼을 가공하면(ex. 함수, 연산, 형 변환 등),
정상적인 Index Scan을 할 수 없다.
인덱스 구성 컬럼을 포함하지 않은 표현식을 가공하도록 개선해야 한다.
6. 필요한 컬럼만 명시
*(Asterisk) 대신 필요한 컬럼만 명시한다.
SELECT 구문의 Column List에는 반드시 필요한 컬럼만 명시하고,
개발 시 확인용으로 입력한 컬럼 중
FUNCTION을 이용한 컬럼은 반드시 제거한다.
7. COUNT(*) 사용 최소화
특정 조건을 만족하는 데이터가 존재하는지 여부를 판단할 때,
COUNT(*)로 전체 데이터 건수를 조회할 필요가 없다.
데이터가 1건 이상 존재하는지만 확인하도록 작성한다.
8. 정렬(SORT) 작업 최적화
SQL의 성능에 큰 영향을 주는 요인 중 하나인 정렬 작업은 최적화가 필요하다.
정렬 대상이 많을 수록, I/O 및 CPU 부하를 크게 발생시킨다.
정렬이 발생하는 경우의 예를 들자면,
ORDER BY, GROUP BY, HAVING 사용시,
DISTINCT, UNION 사용시(중복 값 제거에 정렬 필요),
MIN(), MAX(), 순위함수(ROW_NUMBER, RANK) 등을 사용시.
이러한 정렬은 인덱스로 제거할 수 있다.
왜냐하면 인덱스는 키 값으로 정렬되어 생성되어 있으므로,
인덱스 컬럼을 조정하여 정렬을 최소화 할 수 있다.
즉, 정렬 대상 컬럼을 인덱스 컬럼으로 추가하면 된다.
9. UNION vs UNION ALL
SELECT 결과에 중복이 없는 경우,
UNION 대신 UNION ALL을 사용하도록 한다.
UNION과 UNION ALL의 차이점은,
UNION은 결과를 합치고 중복된 값을 제거하지만
UNION ALL은 모든 결과를 보여준다.
10. DB 저장형 함수 (FUNCTION)
사실 저장형 함수에 관한 내용은 이 글에 어울리진 않지만,
알아두면 좋으니 작성한다.
DB 저장형 함수는 가급적 사용하지 않아야 한다.
사용이 필요한 대표적인 경우는
암복호화, 혹은 함수 내부 로직이 매우 복잡한 경우이다.
위와 같은 이유로 불가피하게 사용해야 할 경우에는
스칼라 서브쿼리 캐싱 효과를 적절히 활용하도록 한다.
또 함수 호출을 최소화할 수 있도록 작성한다.
예를 들면, 페이지 처리 후 DB 저장형 함수를 호출한다거나,
GROUP BY 후 DB 저장형 함수를 호출하는 방법이 있다.
끝!
'Study > Database' 카테고리의 다른 글
[DB] 인덱스란? - (1) 개념, 장단점, 쓰는 이유 (0) | 2021.05.31 |
---|---|
[DB][MSSQL] PIVOT, UNPIVOT으로 여러 컬럼 합치기 (0) | 2021.04.08 |
[DB] 트랜잭션(Transaction)이란? (+ ACID) (0) | 2021.02.12 |
[DB][MSSQL] 저장 프로시저(Stored Procedure)란? (0) | 2021.01.22 |
[DB][PostgreSQL] PostgreSQL 완전 삭제하는 방법 (0) | 2020.08.28 |