-- 1. 정렬 및 비교 관련 파라미터 확인 -- SELECT * FROM nls_session_parameters WHERE parameter IN ('NLS_COMP', 'NLS_SORT'); -- Result -- PARAMETER | VALUE ------------------- NLS_SORT | BINARY NLS_COMP | BINARY -- 2. 대소문자 비교 테스트 SELECT * FROM dual WHERE 'a' = 'A'; ==> 0 Row -- 3. 세션 파라미터 변경 ALTER SESSION SET NLS_SORT=BINARY_CI; ALTER SESSION SET NLS_COMP=LINGUISTIC; -- 4. 대소문자 비교 테스트 SELECT * FROM dual WHERE 'a' = 'A'; ==> 1 Row
-- 0. 인덱스 생성, (Oracle XE 11.2.0.2.0) CREATE INDEX emp1_ename ON emp1(ename); -- 1. 대소문자 구별 안하도록 설정 --> 인덱스 안탐 ALTER SESSION SET NLS_SORT=BINARY_CI; ALTER SESSION SET NLS_COMP=LINGUISTIC; SELECT ename FROM emp1 WHERE ename = 'SCOTT'; --> Table Full Scan SELECT ename FROM emp1 WHERE ename > 'SCOTT'; --> Table Full Scan SELECT /*+ INDEX(emp1 emp1_ename) */ ename FROM emp1 WHERE ename = 'SCOTT'; --> Table Full Scan -- Filter Predicates : NLSSORT(ENAME,'nls_sort=''BINARY_CI''')=HEXTORAW('73636F747400') -- 2. 대소문자 구별하도록 설정 복원 --> 인덱스 탐 ALTER SESSION SET NLS_SORT=BINARY; ALTER SESSION SET NLS_COMP=BINARY; SELECT ename FROM emp1 WHERE ename = 'SCOTT'; --> Index Range Scan SELECT ename FROM emp1 WHERE ename > 'SCOTT'; --> Index Range Scan
-- 다시 확인해봐도 전부 소문자일 경우는 인덱스를 타는 것 같습니다. SELECT ename FROM emp1 WHERE ename = 'scott'; --> Index Range Scan -- 하나라도 대문자가 끼어있으면 풀스캔 하는 것 같은데.. 제가 보는 환경에서만 이럴까요? SELECT ename FROM emp1 WHERE ename = 'SCOTT'; --> Table Full Scan SELECT ename FROM emp1 WHERE ename = 'Scott'; --> Table Full Scan SELECT ename FROM emp1 WHERE ename = 'sCott'; --> Table Full Scan SELECT ename FROM emp1 WHERE ename = 'scOtt'; --> Table Full Scan
case insensitive 하게 인덱스를 생성하는 방법이 있나봅니다.
http://www.dba-oracle.com/t_case_insensitive_indexes_searches.htm