索引に関して
ちと質問されたので簡単にまとめ
SELECT 列名,列名,・・・ FROM 表名 WHERE A列=値 AND B列=値;
こんなWHERE句の場合、A列とB列に索引を作成するのが普通だと思う。(データ数がいくつとか、コストベースとかそういうのは抜きにしてね)
この場合の索引作成は
CREATE INDEX 索引名 ON 表名(A列,B列);
としたくなるけど、必ずこうしろってわけじゃない。
例えば、上記SELECT文以外に
SELECT 列名,列名,・・・ FROM 表名 WHERE B列=値;
という絞りこみがある場合なら
CREATE INDEX 索引名 ON 表名(B列,A列);
この索引だけつくっとけば
・B列のみも対応
・「A=値 AND B=値」にも対応
・「b=値 AND A=値」にも対応
つーことで無駄な索引をつくらないようにしよう。
後は
・・・ WHERE TO_CHAR(列名,'YYMMDD')=TO_CHAR(列名,'YYMMDD');
みたいに、関数で列値を加工して検索する場合には、列に設定した索引は使われないんで、
ファンクション索引にしておくこと。(Oracle8i以降)
CREATE INDEX 索引名 ON 表名(TO_CHAR(列名,'YYMMDD'));
要するに、関数で計算した後の値で検索するんだから、
関数で計算した値で索引つくっとこうや。
って事です。