2

正在考慮爲我的數據庫設計新表格。我在將最終計算存儲在表列中或者在計劃創建的視圖中進行計算之間存在很大的分歧。例如,如果要將值10存儲在一列中,並將另一列中的值存儲爲5,並且您希望將(10/5)存儲在另一列中,那麼將5存儲在自己的列中還是計算它在計劃的視圖?數據庫存儲vs數據庫CPU - 存儲計算數據或使用視圖進行計算

該表格每天可能包含大約400k條記錄,可能一年左右。儘管我可以使用簡單的數據類型來降低存儲成本,但是我仍然需要爲每條記錄保留另外4個字節的數據。*我可能在同一行中有多少個計算記錄。

我會在幾天的數據中查詢計算出的值。我仍然想要速度,但也希望更小的數據庫,更容易維護表和視圖的靈活性。

你的觀點和想法是什麼?

+0

從「採取兩個 - 快速,好,便宜」你似乎想要所有3 ...你的數據量似乎足夠大,所以嘗試和測量這兩種情況應該很容易還清從長遠來看...... –

+0

是的,我會對兩者做一些測試,只是好奇其他人可能會發現哪些最重要。 – TravisWhidden

回答

0

如果你有一個開發環境,我會建議測試這兩種方法,並選擇一個提供最佳性能的工作/維護成本。即使表中存儲了約400k條記錄,根據您訪問數據的方式,一種方法可能更有意義。

1

我將針對查詢的計算值...

我有什麼辦法?

  • 如果在SELECT列表中提到計算的值,則不要存儲它。
  • 如果它位於WHERE中,則需要對其進行索引,在這種情況下,大多數DBMS會強制您以某種方式保存它。

對於CPU小幅增加,你會減少存儲需求,從而增加高速緩存效率,並因此降低了I/O,這往往是最大多數OLTP工作負載的重要性能瓶頸。當計算成本很高時,緩存結果是合理的,但是一個簡單的劃分與此閾值相差甚遠。

要麼在表中作爲一個正常的字段,或者作爲一個持久化計算列或物化/索引視圖。

1

數據完整性是最重要的。

在視圖中計算結果保證爲您提供最新的答案。權衡是SELECT語句的運行時性能,特別是如果在WHERE子句中使用結果。根據我的經驗,計算結果很少用於WHERE子句中。並且通過計算,我的意思不僅是算術,而且字符串和子字符串提取和連接,校驗和計算等。

將計算結果存儲在基本表中會爲您提供最佳SELECT性能。權衡是數據完整性。如果你可以寫一個CHECK()約束來保證結果總是正確的,你應該這樣做。但是,對於複雜計算的CHECK()約束有時在不使用用戶定義函數的情況下不可能表達,並且並非所有平臺都支持CHECK()約束中的用戶定義函數。

如果你不能寫一個CHECK()約束,你仍然需要一些類型的程序來定期檢查你的數據是否有錯誤。在最糟糕的情況下,您可以在低需求期間每天或每週運行一次報告。

物化視圖可能會給你兩全其美的好處 - 一個計算可以成爲可擴展的WHERE子句的目標,並且始終保證是正確的。 (SQL Server等價物被稱爲索引視圖。)權衡是存儲空間和CPU週期,以便更新基表時保持物化視圖及其索引最新。

通常情況下,我會先嚐試一個視圖。但在你的特定情況下--365天每天400k行 - 我想我會先嚐試物化視圖。它不管什麼原因都無法正常工作,您可以用基表中的列代替它,放下物化視圖,並創建一個具有相同名稱的新視圖。 (邏輯數據獨立的石頭。)