4

単純なテーブル構造を想像してください。

Table1        Table2
----------    ----------
ID<-------|   ID
Name      |-->Table1ID
              Name

Table1数百万行あります(たとえば、350万行)。主キーによる削除を発行します。

DELETE FROM Table1 WHERE ID = 100;

Table2で参照Table1する行がないID = 100ため、削除は外部キー制約に違反することなく機能します。

削除にはどのくらいの時間がかかると予想されますか? 数ミリ秒程度?数百ミリ秒?1秒以上?数秒?など、マシンが動かなくなっておらず、リクエストをすぐに処理できると仮定します。

現在、このような削除に約 700 ミリ秒かかる状況があります。私には、これは遅すぎるようです。私が基地から外れているのか、それとも他の人がこれが遅すぎることに同意するのか、そしてそれをより速くするのに役立つ推奨事項があるのか​​ 興味があります!

実際の実行計画は次のとおりです。

実行計画

(ここの XML 実行計画: http://pastebin.com/q9hSMLi3 )

クラスター化されたインデックスの削除 (81%) は、クラスター化された PK、非クラスター化の一意のインデックス、および非クラスター化の非一意のインデックスにヒットします。

4

2 に答える 2

4

問題は、外部キーを検証するためのクラスター化インデックス スキャンです。

削除が成功し、違反の原因となる一致するレコードがない場合は、すべてをtable2スキャンする必要があります。このテーブルには 1,117,190 行あるため、これはコストのかかる操作であり、インデックスの恩恵を受けることは間違いありません。

実行計画に示されている 10% の数値は、特定のモデル化の仮定に基づいた単なる見積もりです。

計画全体の費用は で0.0369164、表 2 のスキャンの費用は で0.0036199、残りの費用はすべて で計算されます0.0332965。ただし、クラスター化インデックス スキャン オペレーターの場合、推定 CPU コストは1.22907であり、推定 IO コストは10.7142(totaling 11.94327not 0.0369164) であることに注意してください。

この不一致の理由は、スキャンが反準結合演算子の下にあり、一致する行が見つかるとすぐにスキャンが停止する可能性があるためです。推定サブツリー コストは、テーブルのごく一部のみがスキャンされた後に発生するというモデリングの仮定の下で縮小されます。

FK 違反がなく、削除が成功した場合は、テーブル全体をスキャンする必要があるため、縮小されていない数値を使用する方が有益です。

11.94327実際に発生したフル スキャンを表すそのオペレーターのコストを使用してパーセンテージを再計算すると、このスキャン オペレーターは計画コストの 99.7% として表示されます ( 11.94327 / (11.94327 + 0.0332965))。

于 2012-12-12T18:41:29.550 に答える
1

タッチされているすべてのページがキャッシュ内にある場合、CPU コストとログ書き込みについて約 1 ミリ秒以下を期待できます。クライアント ライブラリのオーバーヘッドは、実際には、サーバーの負荷よりも CPU の点で大きい場合があります。

キャッシュにないページごとに、磁気ディスクで 5 ~ 10 ミリ秒のディスク シークが予想されます。大まかに言えば、アクセスされるインデックスごとTable1に 1 回のアクセスとTable2、FK を検証するための 1 回のアクセスが期待できます。

実行計画は、どの物理操​​作が実行されるかを確実に示します。

700 ミリ秒は多いようです (70 インデックス?!)。実際の実行計画を投稿してください。サーバーはアンロードされ、ロックによるブロックはありませんか?

于 2012-12-12T17:27:08.240 に答える