インデックスを作成したテーブルにインサートするとえらいコストがかかる問題


あらすじ

1.業務にてなんか処理が重いところがあるとのことで調査

2.関係ありそうな記事の発見
Oracle INDEXを追加したときUPDATEとINSERTにどのくらい影響するのか

3.DBを調べた→インデックスバリバリ張られてる

4.対応策 考えたパクった
⇒参考1:
サイト名Oracle:ローカルインデックスで作成した主キーを無効化、有効化するとグローバルインデックスに変わってしまう

⇒参考2:
サイト名SQLServer

使用SQL

Index無効化.sql
Use [テーブル名]
ALTER INDEX [インデックス名] ON
[テーブル名] Disable
Index有効化.sql
Use [テーブル名]
ALTER INDEX [インデックス名] ON
[テーブル名] REBUILD

調査

業務でのねたなので写真は張れないのでメモ書き程度
処理:Insert文
結果:SQLの実行プランにて確認

区分 推定コスト Indexオブジェクト数 実行時間
インデックス有り 0.0700084 7 13:39:40
インデックス無し 0.0100024 1 14:09:59

※インデックスなしの残っているオブジェクトはPKです。さすがにこいつは無効化するの怖すぎる

結論

  • 実際に使うとしても

    • Indexの無効化⇒InsertないしUPdate⇒Indexの有効化となるためSQL処理を二つ追加せねばならない…。
  • 推定コストはよくなったが、実行時間が増えた…。

  • 大量データ時に力を発揮すると考えたい


以上、何かあればコメントお願いいたします。