web-dev-qa-db-ja.com

SQL Serverでの挿入の高速化

いくつかのテーブルにいくつかのレコードを挿入するストアドプロシージャがあります。少なくともいくつかのテーブルでは、挿入されたレコードの数は10000以上です。 15K以下です。取る3-5 minsこの手順を完了するには。また、同じ手順を複数のユーザーセッションから呼び出すことができます。その結果、一部のセッションは応答を取得するために20分間待機します。この時間を短縮するために私ができることはありますか?

データベースの回復モードはFULL(変更不可)であるため、私の理解ではsqlBulkCopyはここでは役に立ちません。これについてのあなたの考えを聞いてみたいです。

テーブルには15列が含まれています。このうち5つの列は、このテーブルの外部キーです。 ID列はありませんが、5つのすべての外部キー列を組み合わせたクラスター化インデックスがあります。他のキー列にいくつかのインデックスがあります。残りの列は10進数とvarchar(50)です。ただし、varchar(max)列は1つあります。

あなたの参照のためにクエリまたは同じクエリを取得しようとしています。クエリで最も高価な操作(54)の画面グラブ:

Plan image

テーブルのクラスター化インデックスがID列ではなく列の組み合わせにある場合、挿入は影響を受けますか?

基本的には、クエリは 'this_tableからこのテーブルに挿入し、主キーが外部キーである他の5つのテーブルと結合して、これらの値を更新します。結合はすべて、テーブル間のキーにあります。クエリを投稿してもかまいませんが、クエリに関連するすべてのテーブルのスキーマも必要ですか?

EDIT2:まず、皆さんの回答、コメント、および考えをありがとうございました。読み取りが発生するオブジェクトは、クラスター化インデックスのないヒープであることが判明しました。これを変更すると、読み取り操作が大幅に改善され、全体的に改善されました。

問題にアプローチする系統的な方法を提供したので、David Spilletの回答を承認済みとしてマークしました。質問の投稿についていくつか学びました:)

また、コメントと回答についてフリスビーに感謝します。私は質問を修正し続けたことを知っています:)

4
f444ran

手順についての詳細なし[1] そして、それが挿入しているテーブルは、特定のヘルプを提供することはできません。しかし、いくつかの一般的なアドバイス:

  • 行を個別に挿入する場合は、可能であれば一度に大きなブロックに挿入されるように配置してください。
  • 他のプロセスによって保持されているロックがクリアされるのを待つのではなく、独自のアクティビティが原因で手順が実際に遅いことを確認します。
  • ビューまたは複雑なインラインステートメントから挿入された行をプルしている場合は、これが最適化されていることを確認してください(おそらく、新しい行を書き込む前に必要なものを読み取るときに、回避可能なテーブルスキャンが行われているなど)。
  • 複雑なステートメントを使用している場合やデータを段階的に処理している場合は、tempdbに不要なものをスプールしていないことを確認してください。

[1]それが「極秘」であるため、コードを直接含めるだけではできない場合[2] または(長い場合)Pastebinまたは同様のものを使用して、おそらくサニタイズされたバージョンですか?
[2]もしそれがthatのトップシークレットである場合でも、公の場で無料のアドバイスを求めるのではなく、コンサルタントに支払うべきです;-)

更新

投稿されたクエリプランは、その特定のステートメントについて、書き込みの問題ではなく読み取りの問題があることを示唆しています。行ごとに集約された数値を提供する相関サブクエリがあり、フィルターに適したインデックスがないようです(余分な並べ替え操作を回避できるインデックスがあるため、インデックススキャンは行われませんでした)ソートが続きます)。それ以上(とにかく当て推量です)私は、すでに要求された詳細なしでは言うことができません。この特定のステートメントの場合:ステートメント54のSQLと、「object8」および「object9」のテーブル+インデックス構造、できれば難読化なし[3]。

[3]名前を偽装することで、あなたが実際に達成しようとしていることについての手掛かりを与えるかもしれない何かを隠します。 本当にする必要がある場合を除いて、私たちがあなたを助け、要求された詳細を提供し、積極的に詳細を隠さないでください。

費用の割合について

アーロンが言ったように、コストの割合は、90年代後半のMicrosoftの開発者PCの特定の構成のおおよそ時間に基づいています。それでも、それらは推定値/指標およびIIRC以外のものであるようには意図されていませんでした。それ以降、CPUおよびメモリテクノロジーの変化を説明するために、計算は揺れ動きませんでした。また、計算は論理演算で機能します。これらは、メモリで実行された処理と物理演算を区別しませんIO演算。高価な1つのチャンクだけでなく、残りのクエリも考慮するように注意してください-費用が他の場所で最適化に失敗し、数回または1回ではなく数百万回実行されることで費用が発生する可能性があります-実際には、コスト%によってその部分を最適化しようとする可能性があります核心的な問題は一歩か少し離れています。

8
David Spillett