2010-10-21 54 views
3

如果我有一個大的表,其列的值範圍相當有限(例如< 100),將此表分成幾個名稱與該列值相關的表是合理的嗎?基於列值將數據劃分到不同的表中是否合理?

E.g.像列的表:

 
table "TimeStamps": [Id] [DeviceId] [MessageCounter] [SomeData]

其中[DeviceId]是「有限範圍」一欄將被分成幾個不同的表:

 
table "TimeStamps1": [Id] [MessageCounter] [SomeData] 
table "TimeStamps2": [Id] [MessageCounter] [SomeData] 
... 
table "TimeStampsN": [Id] [MessageCounter] [SomeData] 

我跟我原來的表遇到的問題是要找到一個某些DeviceId值的最大MessageCounter值需要很長時間才能執行(請參見this後)。

如果表格會被分開,找到最大列數應該是O(1)操作。

[編輯]

只是偶然發現了這一點,以爲我會更新它。通過一些適當的索引配置和預定索引重組工作,我能夠以規範化的形式獲得優異的性能。我建議嘗試SSMS 數據庫引擎優化顧問工具爲每個瓶頸查詢,這是非常有幫助的(對於誰的主要工作不是數據庫設計)。

回答

6

雖然你可以做它最後的性能優化,我會建議反對它。主要是因爲它容納新的DeviceID非常困難。

無論如何,這樣做不應該是必要的。如果有DeviceID的索引,DBMS應該能夠快速過濾它。這就是DBMS的用途,畢竟...

+1

好的,非常感謝,原來我訂購的組合索引中的列完全錯誤。將DeviceId列移動到索引頂部會立即返回結果。 – Groo 2010-10-21 11:14:48

+0

@格羅:是的,有索引的列順序很重要。我過去遇到過同樣的問題。 – sleske 2010-10-22 11:24:49

+0

+1這種解決方案(由Groo提出)是一種'絕望的措施'。在走這條路之前做調整 - 特別是索引調整是一條路。 – 2010-10-28 18:15:55

2

這是分佈式數據庫的用途。服務器根據某個列在同一個數據庫中共享一個表。您可以根據列值的範圍告訴服務器如何分配表。一旦設置完成,您只需查詢表並不關心數據實際駐留在哪臺服務器上。

5

我擔心這種方法會增加任何需要訪問這些數據的應用程序的複雜性。另一種方法可以讓您將每個設備放置在一個單獨的表中,並將所有設備保留在同一個表中,從而獲得任何好處,可以將該表分區到DeviceID上。我建議你調查表分區,看它是否適合你的需求。

分享和享受。

相關問題