2017-11-18 5 views
0

バルクレコードを更新するには、SQL複雑な計算と

を以下のシナリオを考えてみましょう私は、これらの上記の表では 表A、 表Bと 表C.

を持っていますごとにその記録を更新されますする必要があります一定の時間間隔で各列の計算式を計算する。 (たとえば、一度24時間)

私はストアドプロシージャを試して、レコードを更新するクエリを記述してジョブスケジューラで作成しました。

この手順を実行すると、SQL Server管理スタジオが実行され、各テーブルの5000レコードのためにハングして15-20分かかることがあります。

私は更新プロセスを3つの別個のプロシージャに分割し、レコードのカウントに基づいて各プロシージャの実行時間を1分と書き留めました。でも手順の最適化の後

、例外を回避するためのデータを更新するために提供する必要があるトランザクションのどのような

  1. タイムアウトの問題からサーバーを保持する可能性はありますか?

私のDBプラン情報:

私はレンタルシステム製品を開発しています。 その部屋情報はテーブル1で利用可能になります。 賃貸された顧客情報は表2にあります。 賃貸された部屋とそのテナント請求書は表3にあります。 賃貸部屋とそのテナント領収書は表4

ステップ1:すべてのテナントの総支払額、日数、月ごとの請求書をテーブルレコードで更新するwhileループで計算する必要があります。

ステップ2:各請求書の延滞料総額を定期的に計算する必要があります。 (注:後払い料金は、同じ請求書の計算日に基づいて異なります)

したがって、毎日の計算値ですべてのリースの共通テーブルとしてテーブル5に保存しています。 私はすべてのデータを計算するための共通のストアドプロシージャを作成し、ユーザ定義関数に基づいてテーブル5に更新します。

私はテーブル5からすべてのレポートとグリッドにフェッチしています。

問題文: 私はこの手順を最適化していますが、実行中は約150秒ほどかかります。

質問:このアクションのトランザクションを実装するにはどうしたらいいですか?同じテーブル内のデッドロックや他のデータを避けて適切な方法で行う方法は、同時にアクセスする必要がありますか?

+1

毎回すべてのレコードを更新する必要がありますか?最後の更新後に変更されたレコードを更新する必要がある場合は、 "LastModifiedOn"のような日付時刻の列を追加できます。その後、 "LastModifiedOn"日付が最後の更新より大きくなったこれらのレコードのみを更新することができます。 – gotqn

+0

私は最後にレコード列を更新するために毎日実行しなければならない列を変更しています –

+1

あなたのストアドプロシージャを表示してください、5000レコードは全く巨大とは見なされません。ストアドプロシージャが何をしているのかを説明してください – Squirrel

答えて

0

あなたは

https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/configure-the-remote-query-timeout-server-configuration-option

SQLサーバー管理スタジオのタイムアウトセッションを変更するには、以下のリンクに行くことができると私はあなたのLDFを圧縮することにより、できる限りご限り自由にお使いのドライブの空き容量を維持示唆およびmdfファイル。カーソルを使用している場合

0

私はこの提案

が損傷していないあなたは、「トランザクション」とカーソルのそのアウトを使用している場合(その可能ならば)、それは

参加するように変更しようとする場合には持っているあなたデータをカーソルに持ってきて、クエリを終了してからカーソルにカーソルを合わせてください。