2009-01-25 123 views
22

我試圖堅持保持數據庫規範化的做法,但這導致需要運行多個連接查詢。如果許多查詢使用連接vs調用可能包含冗餘數據的單個表,性能是否會降低?SQL聯接與單表:性能差異?

回答

16

保持數據庫正常化直到您發現瓶頸。然後,只有在仔細分析後,你才能正常化。

在大多數情況下,擁有良好的索引覆蓋集和最新的統計數據將解決大多數性能和阻塞問題,而無需任何非規格化。

如果存在寫入和寫入操作,則使用單個表可能會導致更差的性能。

1

通過設置適當的索引,您的聯接可以非常快速地執行。使用SQL事件探查器確定需要創建或更改哪些索引以優化常見查詢的性能。一定要爲您的數據庫設置一個維護計劃,以便每週運行一次(或每天更新大量更新的表)以更新您的統計信息和索引。

標準化通常優先於將數據保存在多個位置。有些情況下插入/更新不需要快速發生,並且選擇需要很快發生,在這種情況下,如果沒有標準化,您可能會更好。即便如此,不建議過早優化,所以首先要採用標準化結構。

0

通過某些雲網站可以實現的最終優化優化之一,實際上是使用更少數量的更廣泛的有限能力表來提高效率。到目前爲止,如果您需要大規模擴展,這是一種方法。但是對於任何關係型dbms(這些都不是),這不被認爲是可取的做法。

如果您遇到性能問題,首先需要處理很多事情,然後再進行任何類型的反規範化。

2

由於我們將代碼優化留給編譯器的原因相同,我們將查詢優化留給數據庫。

這些天,大多數現代RDBMS在這方面都很不錯。

在您認爲在某些情況下非規範化是'好'之前,請考慮這一點:通常您對每個屬性都不感興趣。因此,從磁盤加載不需要的數據效率不高(通常是數據庫中效率最低的組件)。如果你有一個非規格化的設計,並且連續有大量的冗餘數據,情況會更糟。更糟糕的是,如果您必須更新所有冗餘數據。加載一些僅包含感興趣列的窄表並加入它們會更有效率。再次,這取決於數據庫,所以沒有分析你不知道。

如果您真的擔心性能,那麼您可能在談論可伸縮性問題。在這種情況下,您可能需要查看sharding,對此,適當的(規範化的)模式設計很重要。

14

邁克爾·傑克遜(不是那個一個)是famously believed to have said

  • 程序優化的第一條規則:不要做。
  • 程序優化的第二條規則 - 僅限專家:不要這樣做。

這可能是在RDBMS出現之前,但我認爲他已經將規則擴展到包含它們。

多表選擇幾乎總是需要一個規範化的數據模型;就像這種問題經常出現這種情況一樣,「正常」的答案是否定的?問題取決於幾個因素。

DBMS平臺。

多表單與單表查詢的相對錶現受應用程序所在平臺的影響:查詢優化器的複雜程度可能會有所不同。以我的經驗爲例,MySQL在單表查詢中尖叫得很快,但並沒有如此優化多個連接的查詢。對於較小的表格(小於10K行),這不是一個真正的問題,但對於大型(10M +)表格確實很痛苦。

數據量

除非你正在尋找在100K +行區表,有相當多不應該是一個問題。如果您正在查看數百行的表格大小,我甚至不會考慮索引。

(去)正常化

正常化的整點是最大限度地減少重複,以儘量保證必須更新的任何字段值只需要在一個地方進行更改。非規範化破壞了這一點,如果對重複數據的更新很少(理想情況下它們永遠不會發生),這不是什麼大問題。複製任何東西,但大多數靜態數據之前,所以覺得很小心,注意,您的數據庫可能顯著

要求/約束​​

你想達到什麼性能需求的增長?你有固定硬件還是預算?有時,性能提升可能最容易 - 甚至最便宜 - 通過硬件升級實現。您期望的交易量是多少?比如說,一個小型企業會計系統與Twitter的概況非常不同。

最後一個想法讓我感到震驚:如果你足夠的不夠規範,你的數據庫與平面文件有什麼不同? SQL對於靈活的數據和多維的retieval來說是極好的,但它可能比直接連續或相當簡單的索引文件慢一個數量級(至少)。

+0

感謝您的迴應 – zsharp 2009-01-25 21:47:35

1

爲了規範化,分解表是有代價的。這個成本有一個性能組件。分解表和在查詢中加入數據的性能成本可以通過以下方式保持低水平:使用良好的DBMS;設計正確的桌子;設計指標權;讓優化器完成工作;並調整物理設計的DBMS特定功能。

構建實現連接的大型表格也有成本。關於更新異常和編程困難的成本在正常化的很好的教程中概述。組成表格還有性能成本。在許多DBMS產品中,加載一行非常大的內存成本比加載較小的行成本更多。當你編寫非常寬的表時,你最終迫使DBMS讀取非常大的行,只丟掉大部分讀入內存的數據。這可能會比標準化的速度慢下來。

一般來說,不要隨意反規範化。必要時,使用經過你之前的人測試過的設計原則,即使該原則導致某些非規範化。我建議星圖是這樣一門學科。它有很多事情要做。還有很多情況下,標準化設計比星型模式設計更好。

學習不止一套設計原則和學習何時使用哪一套是學習成爲專家的第二階段。