30代専業主婦の独学エンジニア挑戦ブログ

実務未経験の30歳の専業主婦が独学でエンジニアを目指すブログです

「SQLアンチパターン」(クエリのアンチパターン)

勉強記録 

SQLアンチパターン」のⅢ部 クエリのアンチパターンを読んだので、学んだことをまとめました。 

 

SQLアンチパターン

SQLアンチパターン

  • 作者:Bill Karwin
  • 発売日: 2013/01/26
  • メディア: 大型本
 

 <13章>フィア・オブ・ジ・アンノウン(恐怖のunknown)

NULLを一般値として使う
または一般値をNULLとして使う
※一般値をNULLとして使うというのは、NULLを避けるために不明(unknown)とか適用不能(inapplicable)などを意味する値を新たに定義すること)
 
(解決方法)
NULLを一意な値として扱う
NULLをちゃんと理解しよう
 

<14章>アンビギュアスグループ(曖昧なグループ)

GROUP BYでグループ化するときに、グループ化されていない列(SELECTの対象になっているけど、GROUP BYで指定していない列)を参照すると、思っていたのと違う結果が返ってきたり、エラーになったりする。
 
(解決方法)
曖昧でない列を使用する。
サブクエリを使って中間テーブルを作ったり、外部結合の使用
 

<15章> ランダムセレクション

サンプル行をフェッチ(適当に1行どれでもいいから欲しいとき)するときに、データをランダムにソートして最初の行を取得するやり方。
この場合インデックスが効かずテーブルスキャンになるので、時間がかかる
 
(解決方法)
特定の順番に依存しない
ランダムにidを振って、WHEREでひとつ選択する方法など
 

<16章> プアマンズ・サーチエンジン

全文検索をしたいので、パターンマッチ述語(最も一般的なのはLIKE述語)を使用すること。パフォーマンスが低下するのであまりよくない。
 
(解決方法)
RDBMS全文検索向いてないので、全文検索エンジンを使う
有名なものだと、Elasticsearch(エラスティックサーチ)や Solr(ソーラー)がある
 

<17章> スパゲッティクエリ

クエリ数を減らしたいからといって、複雑な処理を1つのクエリで解決しようとすること。バグが発生しやすくなるし、メンテしにくい。他の人が読みにくい。
 
(解決方法)
クエリを分割してわかりやすくする。
複数のクエリの結果をまとめたいときは、UNIONを使うと良い
 

<18章> インプリシットカラム(暗黙の列)

SELECT文でワイルドカードを使う。または、INSERT文で列名の入力を省略してしまう。
 
(解決方法)
列名を明示的に指定して、必要な列だけ取得する。