인덱스를 사용하지 않는 경우
- index 컬럼의 변경
select userno, name
from [user]
where SUBSTRING(name, 1, 7) = 'user123'
-
Not operator
select userno, name
from [user]
where name <> 'abc'
-
null, not null
select userno, name
from [user]
where name is not null
- 옵티마이저의 취사선택
SQL 작성 규칙
- 좌변을 가공하지 마라
- where SUBSTRING(name, 1, 3) = 'abc' → where name like 'abc%'
- where sal * 12 = 2000 → where sal = 2000 / 12
- where isnull(cost, 0) < 100
not null constriant, default 0 값을 테이블에 설정 했어야 한다. 의도한 경우가 아니라면 이러한 쿼리가 나오게 설계를 하면 안됩니다.
- 부정형을 쓰지 마라.
- null, not null 사용하지 마라
null은 비교할 수 없습니다.
null은 인덱스로 만들어 지지 않습니다. 그러나 결합 인덱스에서는 중간 값인 경우 만들어 집니다. - 의도적인 suppressing
where job = 'manager' → where rtrim(job) = 'manager'
의도적인 suppressing의 예
name과 status모두 none unique index이며 equals 조건이므로 index merge로 실행 합니다.
인덱스 양쪽을 비교하여 같은 row id를 찾는 방식이 index merge 방식입니다.
이렇게 하는 것 보다 name의 중복이 거의 없어서 status 조건 보다 더 똑똑한 조건이면 의도적으로 하나의 인덱스만 사용하도록 할 수 있습니다.
select *
from [user]
where name = 'user197'
and status = '90'
select *
from [user]
where name = 'user197'
and rtrim(status) = '90'
[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 게임 서버 프로그래머가 알아야 할 RDBMS
[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 옵티마이저 맛보기
[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 테이블 조인 하면 느리다?
[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 리커시브 모델의 활용
[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 아크 모델(exclusive or)에서의 주의점
[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 부분범위 처리와 전체 범위처리
[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 인덱스의 제대 사용하자
[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - DB 옵티마이저
[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - Nested Loop/Sort Merge/Hash Join
[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - DB 테이블 클러스터링 팩터
[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - DB 절차적 사고 VS 집합적 사고
[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - SQL 집합의 가공
[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - SQL IN의 특징과 IN의 활용
'서버 개발 > 프로그래머를 위한 RDBMS' 카테고리의 다른 글
Nested Loop/Sort Merge/Hash Join (0) | 2020.05.27 |
---|---|
DB 옵티마이저 (0) | 2020.05.27 |
부분범위 처리와 전체 범위처리 (0) | 2020.05.27 |
아크 모델(exclusive or)에서의 주의점 (0) | 2020.05.27 |
리커시브 모델의 활용 (0) | 2020.05.27 |