by Hayato Matsuura

削除


insert文とは違って、delete文にはwhere句があるため、第2章2, 「where句で説明して来た全ての手法が使え、 インデックスの恩恵に直接あずかる事ができます。実際に、delete文は、一致した行を削除するという追加のステップが必要なselectとも言うべき動作をします。

実際の行の削除は、新しい行の挿入と似たプロセスです。特に、インデックスから参照を削除し、インデックスツリーのバランスを保つ動きが 似ています。図8.2の パフォーマンスのグラフも、insertの時のグラフと非常によく似ています。

図8.2インデックスの数による削除のパフォーマンス変化

0.000.020.040.060.080.100.12123450.000.020.040.060.080.100.12インデックス数実行時間 [秒]実行時間 [秒]insert

理論的には、insertと同じく インデックスがテーブルにない場合にdeleteの パフォーマンスは最高になります。しかし、インデックスがないと、データベースは削除すべき行を見つけるのにフルテーブルスキャンを 実行しなくてはなりません。つまり、行の削除自体は高速ですが、削除すべき行を見つけるのは非常に遅いという状況になってしまいます。 このようなケースは、図8.2には現われていません。

ただし、select文が大量の行を返す場合には インデックスがなくてもよいように、大量の行に対してdeleteを 実行する時には、インデックスがなくてもよいでしょう。

ヒント

delete文と update文には、実行計画があります。

where句のないdelete文は、インデックスを使えない分かりやすい例でしょう。ただし通常は、 代わりに専用のSQLコマンドであるtruncate tableを 使用するでしょう。このコマンドは、一度に全行を削除する点を除いてwhere句のないdelete文と同じ効果があります。これは非常に高速ですが、(1) 暗黙的にcommitが実行される、(2) トリガが実行されない、という2つの副作用もあります。

MVCCの副作用

多版型同時実行制御(MVCC)は、ノンブロッキングな並列データアクセスと、 一貫性のあるトランザクションの読み取りを実現する、データベースの仕組みです。 その実装方法はデータベースによって様々で、パフォーマンスに大きな影響を与える場合があります。

例としてPostgreSQLは、テーブルレベルでのみバージョン情報(= 何が参照できるべきかの情報)を保持します。つまり、行を削除したら、「削除済み」フラグがテーブルブロックに立てられます。PostgreSQLの 削除のパフォーマンスは、テーブルにインデックスがいくつ存在するかに 関係しません。テーブルの行の物理的な削除と関連するインデックスのメンテナンスは、VACCUMの 処理の実行時に行われます。

前へ次へ

You can’t learn everything in one day. Subscribe the newsletter via E-Mail, Bluesky or RSS to gradually catch up. Have a look at modern-⁠sql.com as well.

著者について

Markus Winandの写真

Markus Winand氏は、開発者がSQLパフォーマンスを改善するお手伝いをしています。彼は、SQL Performance Explainedの 著者でもあり、出張トレーニングhttp://winand.at/での リモート講義も 行っています。

彼の本

カバー『SQLパフォーマンス詳解』

核心をわかりやすく 解説。

Markusから購入します
(送料無料+PDF)

Amazon.co.jpで購入
(印刷版のみ)

Connect with Markus Winand

Markus Winand MailinglistsSubscribe RSS feedMarkus Winand on LinkedInMarkus Winand on XINGMarkus Winand on TwitterMarkus Winand on Bluesky
Copyright 2015-2025 Hayato Matsuura, Markus Winand. All righs reserved.
法律上の通知 | お問い合わせ | 無保証 | 商標 | プライバシーとGDPR