「SQLアンチパターン」を読んで【第Ⅱ部】

書籍

SQLアンチパターン

SQLアンチパターン

はじめに

読んだ書籍は1記事にまとめると文量が多くなるため、導入+各部ごとの記事としてまとめる。

本記事は「第Ⅱ部:データベース物理設計のアンチパターン」になる。その他の部についての記事は下記参照。

印象に残った点

※ 下記のカッコ書きは該当する章番号。

ラウンディングエラー(丸め誤差)[9]

- 目的:整数の代わりに小数値を使用する
- アンチパターン:FLOATデータ型を使用する
  - 丸めが避けられない
  - 浮動小数点数の誤差累積がでる
- アンチパターンを用いてもよい場合
  - 科学技術計算を行うアプリケーション
- 解決策:NUMERICデータ型を使用する
  - 精度とスケールを指定し固定精度の小数点数を表現する
  • 保守している製品は計算に利用する値を一旦文字列型データとしてDBに入れ、アプリ側で利用する際は数値に戻して計算することが多い。SQLを使った計算をすることがなければそれで良いのかもしれない。

サーティーワンフレーバー(31のフレーバー)[10]

- 目的:列を特定の値に限定する
- アンチパターン:限定する値を列定義で指定する
  - 限定する値の取得が難しい
  - 値の追加や削除が手間
  - CHECK制約がDBMSによって異なるため移植が困難
- アンチパターンを用いてもよい場合
  - 相互排他的な2つの値(例:左/右、有効/無効)
- 解決策:限定する値をデータで指定する
  - 限定する値の参照テーブルを用意し、外部キー制約で参照する
  • CHECK制約を使うタイミングは気をつけないといけないなぁ。この本を読めば読むほど保守している製品のDBの使い方がユルユルだと感じる。

ファントムファイル(幻のファイル)[11]

- 目的:画像をはじめとする大容量メディアファイルを格納する
- アンチパターン:物理ファイルの使用を必須と思い込む
  - レコード削除時にファイルが連動して消えない
  - ロールバックしてもファイルが消えない
  - SQLのアクセス権と外部ファイルのアクセス権が一致しない
  - レコードにある画像パスが正しいとは限らない
- アンチパターンを用いてもよい場合
  - DBの容量を減らしたい
  - バックアップを短時間で終わらせたい
  - 画像ファイルの編集やプレビューを容易にしたい
- 解決策:必要に応じてBLOB型を採用する
  • 保守している製品は外部ファイルを用いているが、運用を考えるとアンチパターン採用した判断には賛成できる。
  • SQL Server 2008にはFILESTREAMという型があるのか。実際に利用している記事があまり見つからなかった。(使い方紹介が多い。)

インデックスショットガン(闇雲ショットガン)[12]

- 目的:パフォーマンスを最適化する
- アンチパターン:闇雲にインデックスを使用する
  - そもそもインデックスを利用しない
  - インデックスを多くを定義し過ぎる
- アンチパターンを用いてもよい場合
  - なし(情報を集め検討することが必要)
- 解決策:「MENTOR」の原則に基づいて効果的なインデックス管理を行う
  - Measure(測定):クエリのパフォーマンスを測る
  - Explain(解析):クエリの処理が遅くなる原因を解析する
  - Nominate(指名):インデックスを使わないでアクセスしている箇所を特定する
  - Test(テスト):変更による効果を確認する
  - Optimize(最適化):キャッシュサイズを最適化する
  - Rebuild(再構築):不均衡なインデックスを整える
  • インデックスの効果を最大限に活かすためには各製品の詳しい知識が必要となるのか。一般的な知識だけでは十分ではないのか。
  • カバーリングインデックスという存在を知った。本を読んだだけではイメージしづらかったが、こちらを見ると理解出来た。
    • なるほど、こりゃ速くなりそう。