SQLアンチパターンⅢ部のまとめメモです。
自分用にざっくりアンチパターンと解決策だけまとめるので、気になった方はぜひ書籍を読んでみてください。
アンチパターン:NULLを一般値として使う、または一般値をNULLとして使う
データ型を問わず、欠けている値にはNULLを使う。それ以外には使わない。
アンチパターン:非グループ化列を参照する
クエリのSELECT句に列挙されるすべての列は、行グループごとに単一の値の行でなければならない。(単一値の原則)
アンチパターン:データをランダムにソートする
非決定性を持つ式(RAND関数)によってソートを行うことは、テーブルスキャンが発生しインデックスを使えない高コストなソートが行われてしまう。
以下のテクニックを用いてクエリの結果からランダムに行を1つ選択するようにする
- 1と最大値の間のランダムなキー値を選択する
- 欠番の穴の後にあるキー値を選択する
- すべてのキー値のリストを受け取り、ランダムに1つを選択する
- オフセットを用いてランダムに行を選択する
アンチパターン:全文検索でパターンマッチ述語を使用する
パターンマッチ述語の最も大きな問題点は、テーブルスキャンが発生しインデックスを使えないこと。また、意図しないマッチが生じてしまうことが多い。
全文検索したいときは、各種データベース製品で提供される適切なツールを使用すること。
アンチパターン:複雑な問題をワンステップで解決しようとする
1つのクエリで複数のタスクを行おうとしない。
同じ結果を返す複雑で長い1つのクエリと単純な2つのクエリがあるとすれば、後者を選ぶこと。
アンチパターン:ショートカットの罠に陥る
タイプ数を減らすためSELECT句にワイルドカードや暗黙的な列指定を使用しない。
必要な列名は明示的に指定する。