by Hayato Matsuura.

数式


スマートかつインデックスが正しく使われにくい、処理しにくい表現は もう1つあります。論理式を使う代わりに、数式を使うことです。

以下の文を考えてみましょう。NUMERIC_NUMBER列の インデックスは使えるでしょうか?

SELECT numeric_number
  FROM table_name
 WHERE numeric_number - 1000 > ?

同様に以下の文で、選んだ順にABに 対するインデックスは使われるでしょうか?

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)

著者について

Markus Winandの写真

Markus Winand氏は、開発者がSQLパフォーマンスを改善するお手伝いをしています。彼は、SQL Performance Explainedの 著者でもあり、出張トレーニングhttp://winand.at/での リモート講義も 行っています。

彼の本

カバー『SQLパフォーマンス詳解』

核心をわかりやすく 解説。

Markusから購入します
(送料無料+PDF)

Amazonで購入
(印刷版のみ)

Do not use offset for pagination

Learn why

Visit my sibling!A lot changed since SQL-92!

Use The Index, Luke のカップは

ステッカー、コースター、本、コーヒーマグ。 学習に必要なものすべて。

今すぐ購入

Connect with Markus Winand

Markus Winand on LinkedInMarkus Winand on XINGMarkus Winand on Twitter
“Use The Index, Luke!” by Markus Winand is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
法律上の通知 | お問い合わせ | 無保証 | 商標 | プライバシーとGDPR | CC-BY-NC-ND 3.0 license