2017-02-08 22 views
1

우리의 Oracle 데이터베이스 응용 프로그램은 테이블이 테이블 때 우리는 SQL 문 성능은 다음을 사용 우리는이 칼럼 그래서Oracle 내장 UPPER 함수를 사용하여 SELECT 문의 성능이 저하됩니까?

를 사용하여 SELECT 속도를 높이기 위해이 열에 대한 INDEX이 또한 PERSON_NAME
라는 열을 포함 PERSON
라는 포함 잘

SELECT * 
FROM PERSON 
WHERE 1=1 
AND PERSON_NAME = ' Yajli ' 
; 

그러나에 일부 비즈니스 사례
우리는

SELECT * 
FROM PERSON 
WHERE 1=1 
AND UPPER(PERSON_NAME) = UPPER(' YajLi ') 
; 

그러나이 경우에 BAD 성능과 SELECT 쿼리에 우리를 이끌이 많이 걸릴 PERSON_NAME으로 검색 그래서

우리는 SQL 문 다음 시도 대소 문자를 구분하지 않습니다 확인해야합니다 시간

두 경우 모두에 SELECT의 성능을 향상하는 방법 어떤 도움도 함께
* PERSON_NAME으로 검색 민감한
01를 구분하지 않습니다*로 검색 PERSON_NAME은 대소 문자를 구분합니다.

+5

'upper (person_name) '에 인덱스를 만들 수 있습니다. –

+3

두 번째 쿼리는 기존 인덱스를 사용할 수 없어 느립니다. 'UPPER (PERSON_NAME)'에 함수 기반 색인을 작성하십시오. – mathguy

답변

6

원본 쿼리가 PERSON_NAME의 인덱스를 사용하기 때문에 상대적인 성능이 떨어집니다. 그러나 함수를 적용하면 Oracle은 더 이상 인덱스를 사용하지 않습니다.

이 (당신이 제안으로) 자주해야 할 일이 있다면, 당신은 함수에 인덱스를 만들 수 있습니다

CREATE INDEX idx_person_upper_personname ON PERSON(UPPER(PERSONNAME)); 

당신이 기능 UPPER(PERSON)를 사용할 때 오라클은이 인덱스를 사용합니다 WHERE 절.

+0

그래서 동일한 열에 2 개의 색인을 추가해야한다는 것을 의미합니다. 일반적인'person_name'과'upper (person_name)'의 색인을 추가해야합니까? –

+2

@ Yajli Maclo : 예, 두 가지 유형의 쿼리를 모두 지원하려면 두 인덱스가 필요합니다. –

+0

하나의 기능 색인으로 성능을 향상시킬 수 있습니다 .i.e [PERSON (UPPER (PERSONNAME));] – Gok