2016-04-26 84 views
1

我的任務是更換一個昂貴的存儲過程,該存儲過程在10-15個表中執行計算,其中一些表包含數百萬行。計劃是預先進行許多計算,並將結果存儲在單獨的表格中以加速讀取。Pre-Staging數據解決方案

快速創建這些新表並將所有必要的預先數據作爲測試用例插入後,獲得相同結果的執行時間大大提高,正如您所期望的那樣。

我的問題是,保持這些新的單獨表最新的最佳做法是什麼

  • 以特定間隔運行的過程可以這樣做,但有 是要求數據生效。
  • 每張桌上的觸發器都可以這樣做,但這看起來非常昂貴,並且 可能會導致使用這些表的其他地方的速度變慢。

還有其他的選擇嗎?

+2

最佳方法取決於用戶訪問數據的要求。陌生人無法真正回答這個問題。 –

+0

我試圖解釋這些沒有使我的問題太局部化,也許是這個問題的錯誤地方? – William

+1

你考慮過索引視圖嗎? –

回答

1

你有沒有考慮過索引視圖?只要您符合創建索引視圖(無自聯接等)的標準,它可能是一個很好的解決方案。

索引視圖的缺點是當底層表中的數據發生更改(刪除,更新,插入)時,它將不得不重新計算索引視圖。這可能會在某些情況下減緩這些類型的操作,所以您必須小心。我已經在下面提供了一些鏈接。

https://www.brentozar.com/archive/2013/11/what-you-can-and-cant-do-with-indexed-views/

https://msdn.microsoft.com/en-GB/library/ms191432.aspx

https://technet.microsoft.com/en-GB/library/ms187864(v=sql.105).aspx

1

什麼是保持這些新獨立的表是最新最好的做法是什麼?

答案是否依賴。取決於什麼..?

1.How經常你會使用這些計算值
2.什麼是可接受的數據延遲

我們有相同類型的報告,我們計算出的值存儲在單獨的表和reports.In使用它們我們的情況是,我們在通過SQL服務器代理髮送報告之前運行這個sps

1

考慮使用A/B表解決方案。在_A表版本上放置一個通用視圖(CREATE VIEW MY_TABLE AS SELECT * FROM MY_TABLE_A)。然後重新生成_B版本,然後將視圖切換到_B版本(CREATE VIEW MY_TABLE AS SELECT * FROM MY_TABLE_B)。它需要兩倍的處理空間,但它使您有機會在沒有停機的情況下構建您的表格。