複数の値のバッチ挿入と単一挿入: バッチ処理がボトルネックになるのはどのような場合ですか?
驚くべきパフォーマンスの比較では、1000 個の INSERT ステートメントを単独で実行する (290 ミリ秒) 方が、単一の INSERT ステートメントを使用して 1000 個の値を挿入する (2800 ミリ秒) よりもパフォーマンスが大幅に優れていることがわかります。この予期せぬ結果を調査するために、実行計画を分析し、潜在的なボトルネックを特定しましょう。
実行プランを検査すると、単一の INSERT ステートメントが自動パラメータ化プロセスを使用して解析/コンパイル時間を最小限に抑えていることがわかります。ただし、単一の INSERT ステートメントのコンパイル時間は、value 句が約 250 個になると突然増加し、その結果、キャッシュ プランのサイズが減少し、コンパイル時間が増加します。
さらなる分析により、特定のリテラル値のプランをコンパイルするときに、SQL Server が並べ替えなど、線形に拡張しないいくつかのアクティビティを実行する可能性があることがわかりました。コンパイル時にソートを行わなくても、クラスター化インデックスをテーブルに追加すると、プランに明示的なソート ステップが表示されます。
コンパイル段階で、SQL Server プロセスのスタック トレースは、文字列の比較に多くの時間が費やされたことを示しています。これは、式解析ツリーが代数式ツリーに変換される、クエリ処理の正規化フェーズ (バインディングまたは代数化) に関連している可能性があります。
挿入された文字列の長さと一意性を変更した実験により、文字列が長くなり、重複が少なくなると、コンパイル時のパフォーマンスが低下することがわかりました。これは、SQL Server がコンパイル中に重複の比較と識別に多くの時間を費やしていることを示しています。
場合によっては、この動作を利用してパフォーマンスを向上させることができます。たとえば、重複のない列を主ソート キーとして使用するクエリでは、SQL Server は実行時に副キーによる並べ替えをスキップし、ゼロ除算エラーを回避できます。
そのため、単一の INSERT ステートメントを使用して複数の値を挿入する方が、複数の INSERT ステートメントよりも高速に見えるかもしれませんが、多数の異なる値 (特に長い文字列) の処理に関連するコンパイル時のオーバーヘッドにより、パフォーマンスが大幅に低下する可能性があります。 SQLサーバーの衰退。
以上が複数の値を含む単一の INSERT と複数の挿入: バッチ処理がボトルネックになるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。