2017-02-08 9 views
1

当社のOracleデータベースアプリケーションは表が含まれていますが、この表はPERSON_NAME
という列が含まれていPERSON
と呼ばれる。また、我々は、このコラムWHEREでOracleの組み込みUPPER関数を使用すると、SELECT文のパフォーマンスが低下しますか?我々は次のSQL文のパフォーマンスを使用する場合

を使用してSELECTをスピードアップするために、この列にINDEXを持っているそうです細かい

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

2番目のクエリは既存のインデックスを使用できないため、処理が遅いです。 'UPPER(PERSON_NAME) 'に関数ベースの索引を追加します。 – mathguy

答えて

6

元のクエリではPERSON_NAMEのインデックスが使用されるため、相対的なパフォーマンスが悪くなります。ただし、関数を適用すると、Oracleは索引を使用しなくなります。

これは(あなたがお勧めのように)あなたが頻繁に行う必要がある何かがある場合は、機能にインデックスを作成することができます。

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

あなたが機能UPPER(PERSON)を使用する場合、Oracleは、このインデックスを使用しますWHERE句。

+0

したがって、同じ列に2つの索引を追加する必要があります。つまり、通常の' person_name'と、上位 'upper(person_name)'です。 –

+2

@ Yajli Maclo:両方のタイプのクエリをサポートするには、両方のインデックスが必要です。 –

+0

パフォーマンスを向上させるには、1つの機能インデックスで十分です.i.e [PERSON(UPPER(PERSONNAME));] – Gok

関連する問題