索引に関して

ちと質問されたので簡単にまとめ

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'));

要するに、関数で計算した後の値で検索するんだから、
関数で計算した値で索引つくっとこうや。
って事です。