skillup

技術ブログ

Database

アンチパターン バインド変数の未使用+直積組み合わせ+データ量爆発+インデックス関連

投稿日:

本日はSQLコーディングに関して。

ここら辺は実際にプログラムを書く際に重要になってくるネタ。

バインド変数

SQLでプリペアードステートメントを書くのではなく、生のSQLをそのまま書いてしまう手法。

デメリット

  • 実行計画をSQLを書くたびに作成することになるので、負荷が高くなり、性能が落ちる
  • SQLインジェクション

対策

  • バインドするようにプログラムを書き換える
  • 特に発行頻度が高い(ループ内部など)と思われるところを優先的に書きなおす
  • 例外的なケースとしてはフラグ系のところはそれほど影響がない(決め打ちのデータならば処理量は増えないため)

直積により組み合わせが爆発する

SQLの自己結合や外部結合は基本的にはレコードをすべて掛け算するような作りになっている。そのため、結合条件を忘れ、組み合わせが増えすぎてしまうこともある。

結合はループをしていると考える。

デメリット

  •  データ量が増えるにつれ、負荷が高くなり、影響度が多くなる
  • 特定のSQL(組み合わせが多すぎる)のみCPU負荷が大きくなる

対策

  • 結合条件の見直し(結合は基本的にはループと同列に考える。そのためまずはカーディナリティが大きいものから結合したほうが早くなる)
  • 実行計画要チェック

データ量の爆発(インデックスが不適切)

インデックスが不適切に張られていた場合、フルスキャンを行わなくてはならなくなり、スピードが落ちる。特にデータ量が増えたときに影響が顕著。実行計画への理解も必要

デメリット

  • サービスを開始してしばらくしてから特に影響が大きくなる
  • CPU使用率が100%になっている
  • 単純に遅い

対策

  • 性能テストを早い段階でしておく(大量データでのテストが必要)
  • 実行計画を確認し、SQLが適切かどうかの確認を行う

インデックスの貼りすぎ

インデックスを張りすぎると、更新系の作業で非常に時間がかかることになる

デメリット

  • 検索は早いが、データ更新作業で時間がかかることになる

対策

  • インデックス数に関する制限数を行う
  • 正規化されていない列数が多い
  • 大量更新系のテストをしていない
  • 検索が中心になるテーブルの場合は、インデックスを張ることを優先してOKにする

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

アンチパターン 連鎖倒産+エラー監視+データのバックアップ

本日は主にインフラの設計的なことに関して。 Contents1 連鎖倒産1.1 デメリット1.2 対策2 エラー監視2.1 デメリット2.2 対策3 データのバックアップ体制3.1 デメリット3.2 …

no image

データベース設計のアンチパターン 重すぎるOLTP+Date型不統一+データ量想定が甘い

Contents1 重すぎるOLTP1.1 デメリット1.2 対策2 DATE型の型の不統一2.1 デメリット2.2 対策3 データ量の想定が甘い3.1 デメリット3.2 対策 重すぎるOLTP ※O …

no image

MySQL小ネタ テーブル単位のリストア・SQLの小ネタ(バックスラッシュの検索)

MySQLのちょい小ネタ。 Contents1 テーブル単位でバックアップ&リストア2 バックスラッシュの入ったSQLについて テーブル単位でバックアップ&リストア 1 通常のdump(データベース単 …

no image

SQL基礎 case式について

case式に関して。 集約系の関数では複雑な処理を一気に行うことができる。 case式は1列のみ有効。複数の列に対して行うことはできない。 case ~ when ・・・thenではwhenが評価され …

no image

CASE式のすすめ その3

本日もCASE式です。 下記のようなテーブル(studentclub)があるとします。 std_id | club_id | club_name | main_club_flg —&#82 …