서버 개발/프로그래머를 위한 RDBMS

인덱스의 제대 사용하자

지노윈 2020. 5. 27. 10:09
반응형

인덱스를 사용하지 않는 경우

 

  • 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 작성 규칙

  1. 좌변을 가공하지 마라
    1. where SUBSTRING(name, 1, 3) = 'abc' → where name like 'abc%'
    2. where sal * 12 = 2000  → where sal = 2000 / 12
    3. where isnull(cost, 0) < 100
      not null constriant, default 0 값을 테이블에 설정 했어야 한다. 의도한 경우가 아니라면 이러한 쿼리가 나오게 설계를 하면 안됩니다.
  2. 부정형을 쓰지 마라.
  3. null, not null 사용하지 마라
    null은 비교할 수 없습니다.
    null은 인덱스로 만들어 지지 않습니다. 그러나 결합 인덱스에서는 중간 값인 경우 만들어 집니다.
  4. 의도적인 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] - 서브 쿼리 활용

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 인라인 뷰의 활용