2011-01-14 7 views
0

これはTomの質問でしたが、彼は現在忙しいです。Oracleでの機能インデックスの使用

私はDBAではなく、単純なJava EE開発者でもあり、私はOracleを初めて使い慣れており、いくつかのクエリを最適化するように求められました。

私はこの

create table test_table(
    DUMMY VARCHAR2(50), 
    COB DATE, 
    DATA VARCHAR2(100) 
); 

実テーブルCOB日arroundの構造より多くの列を持っているように、大きなテーブルを持っています。この表を処理するには、私はビューを使用します。

create or replace force view test_view("DUMMY", "COB", "DATA") 
AS 
    SELECT 
     DUMMY, 
     COB, 
     DATA 
    FROM test_table 
    WHERE 
     DUMMY IS NULL 
     OR DUMMY <> 'INTFR'; 

私はこのビューを主にCOBの日付で照会します。

SELECT * from TEST_VIEW where COB = '15-Dec-2010' 

そして、私はこの方法は私がBに日のすべてのrecrdsがあるでしょう、私は理解したようこの

CREATE INDEX "TEST_TABLE_DUMMY_COB_IDX" ON "TEST_TABLE" (
    case 
    when DUMMY IS NULL then COB 
    when DUMMY <> 'INTFR' then COB 
    end 
); 

のようになります。これは、クエリの最適化のための特定の機能のインデックスを作りたいです* COBのキーを持つツリーインデックステーブルは、これが私の一般的なクエリの使用を最適化しますか、それを動作させるにはもっと魔法が必要ですか?

答えて

1

インデックス定義内の式がビューのWHERE句で使用されていないため、それを持っていると機能しません。

create index test_table_dummy_cob_idx on test_table 
(case when dummy is null or dummy != 'INTFR' then cob end); 

create or replace view test_view as 
select dummy, 
     cob, 
     data 
from test_table 
where case when dummy is null or dummy != 'INTFR' then cob end = cob; 

実際にクエリを効率的にするかどうかは、データによって異なります。次のように比較する必要があります。

+0

唯一の方法があります: ありがとうございます。 – mavarazy

関連する問題