関数インデックスの考え方を初めて知ると、あらゆるものにインデックスを作成したくなってしまうかもしれません。しかし、 それは本当に最後の手段です。全てのインデックスは、継続的なメンテナンスが必要になるからです。関数インデックスは、冗長な インデックスを作ってしまいがちという点で、特に厄介です。
協力してください
この記事が気に入ったら、私の書いた本「SQLパフォーマンス詳解」や私によるトレーニングもきっと気にいるはず。
ここまで取り上げたような大文字
小文字を区別しない検索は、以下のようにLOWER
関数を使っても実装できます。
SELECT first_name, last_name, phone_number
FROM employees
WHERE LOWER(last_name) = LOWER('winand')
1つのインデックスで、どちらのタイプの大文字小文字を区別しない検索もサポートすることはできませんので、もちろん
LOWER(last_name)
にもう1つインデックスを作ることもできます。しかし、insert
文やupdate
文、delete
文が実行されるたびに、どちらのインデックスも
更新しなくてはなりません(第8章8, 「データの変更」を参照)。1つのインデックスで
間に合わせるには、アプリケーション全体で、一貫して同じ関数を使う必要があります。
ヒント
1つのインデックスを複数のクエリで使えるように、 アクセスパスを統一しましょう。
参照
ORMツールは、開発者が知らないうちにUPPER
や
LOWER
を使うことがあります。例えばHibernateは、大文字小文字を区別しない検索に対して、暗黙的にLOWER
を
付加します。
ヒント
いつも最適な情報がインデックスに入るように、なるべくオリジナルの データにインデックスを作成するように常に心がけましょう。