2017-09-24 104 views
0

我有一個運行存儲過程的網站,當您打開主頁時。該存儲過程處理來自4個關係表的數據並給出結果。由於數據庫記錄增加,存儲過程的完成可能需要超過10秒,而且對於主頁來說太多了。將耗時的存儲過程的結果插入到表中

因此,我認爲,將存儲過程的結果定期插入到新表中並使用該表作爲主頁可能是一個很好的主意來解決問題,但我不確定這是否是SQL Server的良好實踐。

有沒有我的情況下,任何更好的解決方案?

編輯:這4代表每15分鐘約30插入更新。

+0

一種方法是用日期/時間查詢已運行沿着緩存結果的表中的一個副本。當用戶請求數據時,存儲過程會檢查緩存的年齡。如果可以接受,那就是用戶得到的,否則用戶必須等待緩存重建。另一種方法是以適當的時間間隔重新構建緩存的計劃任務。如果正確完成,新查詢運行時總會有可用數據的副本(有點陳舊),這樣就沒有人需要等待結果。 – HABO

回答

0

如果你願意有一個「指定的受害者」根據需要進行更新緩存(這也可能導致其他用戶等待),你可以做這樣的事情在一個存儲過程(SP):

  1. 啓動一個事務來阻止對緩存的訪問。
  2. 檢查緩存條目的日期/時間。 (這要求增加一個CacheUpdated列高速緩存表或其它地方存儲的值。)
  3. 如果緩存的數據是足夠新然後返回的數據,並結束事務。
  4. 刪除緩存的數據和運行新的查詢與適當的CacheUpdated日期/時間來填充它。
  5. 返回緩存的數據並結束事務。

如果更新時間太長了用戶等待,或緩存重建塊太多的用戶,您可以通過在SQL Server代理創建工作運行在預定的時間間隔的存儲過程。 SP將:

  1. 保存當前的日期/時間,例如,作爲@Now
  2. 運行查詢以更新標記每行的緩存CacheUpdated = @Now
  3. 刪除任何緩存行,其中CacheUpdate != @Now

用戶的相應SP將簡單地返回最早的一組數據,即Min(CacheUpdated)行。如果只有一組,那就是他們得到的。如果更新正在進行,則他們將獲得較舊的完整集合,而不是正在進行的工作。我用

0

至於你解釋你的問題,我看到這樣做沒有問題,但你必須更多地解釋,因爲我們不知道你收集的數據的類型以及它是如何提高每一次,以便提供你一個更好的解決方案

+0

我向問題添加了更新頻率信息。 – Yavuz

+0

是否可以通過在SQL Server代理中創建作業按計劃的時間間隔運行存儲過程,我發現在使用某些主機時並不是所有人都可以使用SQL Server代理。有沒有鏈接到您的網站,所以我可以告訴你我最好的方法。因爲可以用其他方式殺死同一只貓,有時它只是將設計改變成一個小小的登陸頁面。不是存儲過程。 –

相關問題