2016-09-07 1 views
0

非常に大きなものになる可能性のあるテーブルで定期的に複数回実行されるクエリがあります。私はクエリをより迅速に処理できるインデックスを確保したいと考えています。私はインデックスに精通していないですが、今のところ私が持っている次のクエリとインデックス:Oracle - 特定のクエリに一致するテーブルインデックスを作成する方法

update PERMISSION 
SET EXPIRED_FLAG=1 
where CASE WHEN VAL_END IS NULL THEN 1 ELSE 0 END =1 
    AND CURRENT_FLAG=1 
    AND SYSDATE+SUBSTR(TO_CHAR(SYSTIMESTAMP, 'TZR'),2,2)/24> VAL_START+30/1400 
    AND EXPIRED_FLAG=0; 

私のインデックスは次のようになります。

CREATE INDEX NDX_VAL_DB_CLOSE ON PERMISSION 
(CURRENT_FLAG, CASE WHEN VAL_END IS NULL THEN 1 ELSE 0 END, CASE WHEN EXPIRED_FLAG=0 THEN EXPIRED_FLAG END) 
PCTFREE 10 
    INITRANS 2 
    MAXTRANS 255 
    STORAGE (
      INITIAL   1M 
      NEXT    1M 
      MAXSIZE   UNLIMITED 
      MINEXTENTS  1 
      MAXEXTENTS  UNLIMITED 
      PCTINCREASE  0 
      BUFFER_POOL  DEFAULT 
      FLASH_CACHE  DEFAULT 
      CELL_FLASH_CACHE DEFAULT 
     ) 
LOGGING 
LOCAL ( 
    PARTITION NDX_VAL_FKTICKET_ID_PRT1 
    LOGGING 
    NOCOMPRESS 
    TABLESPACE IDX_PRT_01 
    PCTFREE 10 
    INITRANS 2 
    MAXTRANS 255 
    STORAGE (
      INITIAL   1M 
      NEXT    1M 
      MAXSIZE   UNLIMITED 
      MINEXTENTS  1 
      MAXEXTENTS  UNLIMITED 
      PCTINCREASE  0 
      FREELISTS  1 
      FREELIST GROUPS 1 
      BUFFER_POOL  DEFAULT 
      FLASH_CACHE  DEFAULT 
      CELL_FLASH_CACHE DEFAULT 
      ), 
    PARTITION NDX_VAL_FKTICKET_ID_PRT2 
    LOGGING 
    NOCOMPRESS 
    TABLESPACE IDX_PRT_02 
    PCTFREE 10 
    INITRANS 2 
    MAXTRANS 255 
    STORAGE (
      INITIAL   1M 
      NEXT    1M 
      MAXSIZE   UNLIMITED 
      MINEXTENTS  1 
      MAXEXTENTS  UNLIMITED 
      PCTINCREASE  0 
      FREELISTS  1 
      FREELIST GROUPS 1 
      BUFFER_POOL  DEFAULT 
      FLASH_CACHE  DEFAULT 
      CELL_FLASH_CACHE DEFAULT 
      ) 
) 
NOPARALLEL; 

実行計画:

enter image description here

I私のインデックスが実際にクエリと一致するかどうかを知りたい実行計画を見ると、インデックスが使用されているように見えますが、インデックスの条件が合っていることを100%確信しておらず、更新クエリと完全に一致していません。実際にクエリと一致させるためにインデックスに行うことができますか、またはすべてのインデックス付きの列が既に使用されていますか? (もう一度、私は完全に索引付けに新しく、これは分割されたテーブルなので少し失われています)

+0

さまざまな述語はどのように選択的ですか?私の推測では、さまざまな1/0述語は特に選択的ではなく、 'val_start'はクエリの唯一の合理的に選択的な述語です。つまり、私は 'val_start'述部が実質的に更新する必要がある行の数を減らし、他の述部はあまり多くないことを推測しています。しかし、それは私の推測です - あなたはあなたのデータを知っています。どのようにテーブルが分割されていますか? –

+0

この表では、エントリのほとんどが期限切れのフラグ= 1を持ちます。選択された数だけが0になり、30分を超えることはありません。現在のパーティション上のパーティションについては、あまり慣れていないプロセスによって制御されますが、時間が掛かり、より多くのエントリが追加されると、現在の値ではなく現在の値= 0である2番目のパーティションに移動するエントリが増えます= 1私が気にしているアクティブパーティション。 –

+0

私の実際の質問はここにあると思います。このインデックスは、更新クエリのコンテキストを考えれば意味があり、実際には表示されている更新クエリで使用されているすべてのパラメータ(述語)です。 –

答えて

0

索引(NDX_VAL_DB_CLOSE)の代わりに別の索引(NDX_PTP_DB_CLOSE)を使用しているようです。正しい索引でOracleオプティマイザ・ヒントを使用しようとします。クエリを再構成するのに使用しない場合

+0

ありがとう、ありがとう、それは私の部分のタイプミスで、インデックスは実際にNDX_VAL_DB_CLOSEを使用しています(これはPTPバージョンと同じですが、名前を変更しました) –

関連する問題