Index-Organized Table 혹은 Index-Only access
Database는 uniqueness에 필요한 모든 컬럼들이 narrower index에 다 들어있는 경우, narrower index를 wider index보다 선호하는 경향이 있다.
하지만, wider index를 사용하면 index only (즉, table access 없이 index 정보만을 사용하여 값을 가져옴)의 효과를 가져오는 경우가 있다. 이 경우에는 명시적으로 wider index를 사용하여 table access를 줄일 수 있도록 한다.
오러클에는 Index-Organized Table을 사용할 수 있다.
Partitioned table
Oracle extension
range condition (주로 date column 사용)
very large table을 위한 방법
Non-Null check
IS NOT NULL 은 index를 사용하지 않음. 정말 필요한 경우는 적당한 range 값 비교를 할 수 있다. (index가 걸려 있는 경우)
e.g, ALL_POSITIVE_COLUMN > -1, DATE_COLUMN > TO_DATE('0001/01/01', 'YYYY/MM/DD')
NOT EQUAL check
inequality 비교는 index를 사용하지 않음. 정말 필요한 경우는 IN (나머지 모든 경우의 값... 물론 많지 않다면...) 을 사용!
OR 나 IN 리스트 사용 시 주의할 점
discrete한 값에 대해 index를 사용하여 range check를 하나, 그렇지 않은 경우에는 index를 사용하지 못한다. 즉, IS NULL 이 포함된 경우 (IS NOT NULL 도 물론)
즉, 다음 경우는 index를 사용하지 않는다. (DB2는 null을 하나의 값으로 보므로 index를 사용한다.)
name = 'ABC' OR name is null
Hash join이 Nested loop join보다 유리한 경우
smaller row set이 충분히 작아 메모리에 다 올라올 수 있을 때
sort merge join을 쓰려고 하는 경우에는 항상 hash join을 쓰는 것이 더 유리할 것이다.