質問

私は、日々のスケジュールでアップデートや新規レコードとマージする必要がある非常に大きなデータ(300万レコード)を持っています。データが更新されている間にライブテーブルをロックしないようにして、実際にレコードセットを実際にレコードセットに分割し、Live TableをロックしないようにするためのMERGEコマンドを実際に使用するストアドプロシージャがあります。問題はそれが正確に役立ちません。テーブルはまだ「ロックアップ」とデータを使用する当社のウェブサイトは、データにアクセスしようとするときにタイムアウトを受け取ります。私は100件の録音塊に分割しようとし、WAITFOR DELAY '000:00:5'を試してみました。塊のマージ間の一時停止に役立つかどうかを確認してください。それはまだやや遅くなっています。

テーブルをロックせずに大規模なデータセットをマージする方法についての提案、ベストプラクティス、または例を探しています。

ありがとう

役に立ちましたか?

解決

select を実行すると、フロントエンドを変更するか読み取られます。

アップデートを実行するには、レコードをロックする必要があるため、NOLockのマージ、挿入、または更新できません。ただし、選択を無効にすることができます。

これを慎重に使うべきです。ダーティの読み取りが問題ない場合は、先に進みます。ただし、読み取りに更新されたデータが必要な場合は、異なるパスを下にダウンして、3Mレコードをマージしている理由が問題の原因となる理由を正確に見つける必要があります。

Mergeコマンドの間にディスクからデータの読み取りやメモリの状況を中心にしてデータの読み取りに費やされることを喜んでいると思います。データベースサーバにもっとRAMを詰め込むだけではないかもしれません。

理想的な量は、必要に応じてデータベース全体をメモリに引くのに十分なRAMを持つことです。たとえば、4GBのデータベースがある場合は、必ず8GBのRAMがあることを確認してください。もちろんX64サーバー。

他のヒント

私はかなり反対の経験を恐れています。ソーステーブルには、ターゲットテーブルとしての行数の割合のみの更新と挿入を実行しました。

運用ウィンドウ全体でソース表のレコードを組み合わせてから一度だけマージを実行したら、パフォーマンスが500%増加しました。このための説明は、厳密なループで何度も何度も何度も一度だけmergeコマンドの正面分析のために支払っていることです。

さらに、4000行の4000行の4000行に比べて4000行の4000行に対照的に、160万の行(ターゲット)を700万行(ターゲット)にマージする(当社の場合は)SQL Serverエンジンの機能を活用しています。ずっといい。繰り返しますが、公正な量の作業が2つのデータセットの分析にあり、これは一度だけ行われます。

もう1つの質問は、mergeコマンドがソーステーブルとターゲットテーブルの両方のインデックスをはるかに優れていることを知っているかどうかです。次のリンクを参照したいと思います。

http://msdn.microsoft.com / en-us/library/cc879317(v= sql.100).aspx

個人的な経験から、マージに関する主な問題は、ページロックをするので、テーブルに向けられたインサートの並行性を妨げるためです。だからあなたがこの道を停止した場合、それはあなたが単一の作家のテーブルにヒットするすべての更新をバッチすることは基本です。

私たちは、挿入が一口あたり0.2秒かかったテーブルを持っていましたが、この時間のほとんどはトランザクションラッチで無駄にされていますので、これをマージの使い方を切り替え、いくつかの迅速なテストが表示されたことがわかりました。 0.4秒または512でさえ0.5秒で256エントリを挿入し、これをロードジェネレータでテストしました。個々のインサート

ソリューションは、単一のプロデューサからのエントリをマージ操作でバッチするだけでなく、追加のレベルのキューを通して単一のマージ操作で個々のDBに移動するプロデューサからバッチをバッチすることでした(以前は単一の接続DBあたりのMARSを使用して、実際のマージトランザクションを実行している保存されたプロシージャへのすべてのプロデューサをインターリーブするためにMARSを使用して、このようにして問題なく毎秒何千ものインサートを処理することができました。

あなたのフロントエンドのすべての読み取りにノロックのヒントを持つことは常に絶対に必須です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top