0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLパフォーマンス詳解 8章:データの変更_1.挿入

0
Posted at

8章:データの変更

1.挿入

結論

INSERTはインデックスの数だけ遅くなるため、
最適化の本質は、「インデックスを減らすこと」


INSERTでやっていること

INSERTはシンプルに見えて内部では2つのことをやっている。

  1. テーブルに行を追加
  2. インデックスをすべて更新

➡ ボトルネックは、インデックス更新


テーブル vs インデックスの違い

テーブル(ヒープ)

  • 空いている場所に書くだけ
  • 順序なし
  • ほぼメモリ処理

➡ 速い

インデックス(Bツリー)

  • 挿入位置が決まっている
  • ツリーを探索するする必要あり
  • 順序を維持する必要あり

➡ 遅い


なぜさらに遅くなるのか

インデックスは単純に追加するだけではない。

  • リーフノードに空きがない → 分割
  • 分割が上位ノードに波及
  • 最悪ツリー全体に影響

➡ 1件INSERTでも遅くなる可能性あり


本質

INSERTのコスト = インデックス更新コスト

  • インデックス1個 → その分だけ処理追加
  • 複数ある → その回数分繰り返し

➡ 「数がそのままコスト倍率」


実務での考え方

  • インデックスは必要最小限
  • 冗長なインデックスはNG

➡ 読み取り性能とのトレードオフ


大量データ挿入時テクニック

大量データを挿入する場合は、以下のようにする。

  • インデックス削除
  • INSERT実行
  • インデックス再作成

➡ 圧倒的に高速になる。(DWHでよく使う)


まとめ

  • INSERTはインデックスで遅くなる
  • インデックス数 = コスト倍率
  • インデックス再作成

➡ 原則:インデックスは「読むための最適化」、書き込みはその代償で遅くなる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?