2017-11-18 82 views
0

考慮以下情形,SQL複雜的計算和更新批量記錄

我有 表A,表 B和 表C.

在這些上面的表格需要得到更新其記錄爲每計算公式在規則時間間隔的各欄中。 (例如24小時一次。)

所以我嘗試了存儲過程,並在作業調度程序中通過編寫查詢來更新記錄。

當我執行過程時,由於每個表中有5000條記錄,執行並完成SQL Server管理工作室將被吊死15到20分鐘。

因此,我將更新過程拆分爲3個獨立的過程,並根據記錄數將每個過程的執行時間記錄爲1分鐘。

即使該過程的優化後,

  1. 什麼樣的交易提供所需要的更新,以避免異常的數據?
  2. 是否有任何其他的可能性來保持服務器超時問題?

我的DB計劃信息:

我開發租賃系統產品。 在該房間信息將在表1中提供。 已租用客戶信息將在表2中提供。 租用房間及其租客發票將在表3中提供 租用房間及其租客收據將在表4中可用

第1步:需要計算所有承租人的總到期金額,以天爲單位的費用,在表中記錄中更新的while循環中的每個發票的月份費用。

步驟2:需要定期計算每張發票的總滯納金。 (注:後期費用將根據同一發票的每天計算基礎而變化。)

因此,我將所有租賃的公用表格存儲在表5中,並以其各自的計算值爲基礎。 爲此,我創建了一個用於計算所有數據的通用存儲過程,並基於用戶定義的函數將它更新到表5.

我從表5中獲取所有報告和網格。

問題說明: 即使我已經優化了程序,當我執行它時,它大約需要大約150秒。

問題:如何實現此操作的事務以及如何通過避免同一表中的任何死鎖和其他數據必須同時訪問時以正確的方式進行操作?

+1

您是否需要每次更新所有記錄?如果您需要更新已更改的記錄,請在上次更新後添加日期時間列,如「LastModifiedOn」。然後,您可以只更新這些「LastModifiedOn」日期大於上次更新的記錄。 – gotqn

+0

我有最後修改的列,基於它必須每天運行更新記錄 –

+1

請向我們顯示您的存儲過程,5000條記錄根本不考慮巨大。還請解釋存儲過程正在做什麼 – Squirrel

回答

0

如果您正在使用遊標,我有這個建議

試圖改變它的加入(如果可能)

,如果你使用的是「交易」和你的光標,如果它不會損壞您的數據嘗試將其帶入遊標並在光標處提交而不是結束查詢後