スマートかつインデックスが正しく使われにくい、処理しにくい表現は もう1つあります。論理式を使う代わりに、数式を使うことです。
以下の文を考えてみましょう。NUMERIC_NUMBER
列の
インデックスは使えるでしょうか?
SELECT numeric_number
FROM table_name
WHERE numeric_number - 1000 > ?
同様に以下の文で、選んだ順にA
とB
に
対するインデックスは使われるでしょうか?
SELECT a, b
FROM table_name
WHERE 3*a + 5 = b
違う角度からこの問題を考えてみましょう。あなたがSQLデータベースの開発者だとしたら、等式のソルバを実装するでしょうか?多くの データベースベンダは「No!」と言っています。そのため、2つの例のどちらも、インデックスは使われません。
協力してください
この記事が気に入ったら、私の書いた本「SQLパフォーマンス詳解」や私によるトレーニングもきっと気にいるはず。
数式を使うことで、全文検索の
LIKE
で同じことをしたように、条件を意図的に抽象化することができます。例えば、ゼロを加算するだけでも
十分です。
SELECT numeric_number
FROM table_name
WHERE numeric_number + 0 = ?
うまく計算式を作り、方程式のようなwhere
句に変換すれば、関数インデックスを使うこともできます。
SELECT a, b
FROM table_name
WHERE 3*a - b = -5
テーブルへの参照を左辺に寄せて、定数を右辺に集めています。それから、左辺に対するインデックスを作ればよいのです。
CREATE INDEX math ON table_name (3*a - b)