私は、このテーブル7000件のレコードnullをチェックするとこのクエリが遅くなるのはなぜですか?
を含む降順ARADMIN.V_PKGXMLCODE
Name Null Type
--------------------- -------- -------------
REQUEST_ID NOT NULL VARCHAR2(15)
AVAILABILITY VARCHAR2(69)
XML_CODE CLOB
PACKAGENAME_UNIQUE VARCHAR2(50)
CATALOG NUMBER(15)
CHILD VARCHAR2(255)
CLASSIFICATION_SYSTEM NUMBER(15)
E_MAIL VARCHAR2(69)
は、クエリ
SELECT COUNT(*) FROM ARADMIN.V_PKGXMLCODE WHERE (CATALOG <> 0 AND CATALOG <> 2) AND (NOT (CHILD IS NULL));
は1秒未満かかりました。
クエリ
SELECT COUNT(*) FROM ARADMIN.V_PKGXMLCODE WHERE (CATALOG IS NULL OR (CATALOG <> 0 AND CATALOG <> 2)) AND (NOT (CHILD IS NULL));
は23秒かかります。
計画を説明するには、しかし、私は何ができる
...それは実際に素早く行くべきと主張しますか?
最初のクエリでもフルテーブルスキャンを実行するのですか、または使用できるフィールド4にインデックスがありますか?そしてもしあれば、テーブルは繰り返し削除され(切り捨てられずに)、ダイレクトパスの挿入(すなわち '/ * + append * /'ヒント付き)で再生成されましたか? –
最初のクエリの計画はどうですか? – nilsman
NULL値にインデックスを付けることができないので、 'IS NULL'条件はインデックスを無視します。索引作成中にNULLABLE列とともに一定の値を使用することで、オプティマイザを確実に騙すことができます。しかし、あなたの質問の範囲内で答えるためには、私が前に述べたようにオプティマイザを騙さない限り、2回目のクエリは** FULL TABLE SCAN **になります。最初のクエリでインデックスを利用し、FTSを回避することができます。 1.第1クエリの説明計画も投稿してください。 2.最新の統計情報ですか? –