非常に大きなものになる可能性のあるテーブルで定期的に複数回実行されるクエリがあります。私はクエリをより迅速に処理できるインデックスを確保したいと考えています。私はインデックスに精通していないですが、今のところ私が持っている次のクエリとインデックス: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;
実行計画:
I私のインデックスが実際にクエリと一致するかどうかを知りたい実行計画を見ると、インデックスが使用されているように見えますが、インデックスの条件が合っていることを100%確信しておらず、更新クエリと完全に一致していません。実際にクエリと一致させるためにインデックスに行うことができますか、またはすべてのインデックス付きの列が既に使用されていますか? (もう一度、私は完全に索引付けに新しく、これは分割されたテーブルなので少し失われています)
さまざまな述語はどのように選択的ですか?私の推測では、さまざまな1/0述語は特に選択的ではなく、 'val_start'はクエリの唯一の合理的に選択的な述語です。つまり、私は 'val_start'述部が実質的に更新する必要がある行の数を減らし、他の述部はあまり多くないことを推測しています。しかし、それは私の推測です - あなたはあなたのデータを知っています。どのようにテーブルが分割されていますか? –
この表では、エントリのほとんどが期限切れのフラグ= 1を持ちます。選択された数だけが0になり、30分を超えることはありません。現在のパーティション上のパーティションについては、あまり慣れていないプロセスによって制御されますが、時間が掛かり、より多くのエントリが追加されると、現在の値ではなく現在の値= 0である2番目のパーティションに移動するエントリが増えます= 1私が気にしているアクティブパーティション。 –
私の実際の質問はここにあると思います。このインデックスは、更新クエリのコンテキストを考えれば意味があり、実際には表示されている更新クエリで使用されているすべてのパラメータ(述語)です。 –