2011-09-29 50 views
0

假設我們有這樣的表:是它相當快查詢不同的表比具有where子句

create table Foo(
id int, 
name varchar, 
k int --can be 1 or 2 or 3 
) 

,或者我們可以具有用於每個k值3個表

create Fook1(
id int, 
name varchar 
) 
... 
create table Fook2 
... 
createa table Fook3 

是它將是相當快的事:

select * from Foo where k = 3 

比做:

select * from Fook3 
+0

你可以給一個**真實的**例子嗎?如果你只有3個值,那麼將它們放在單獨的表中會(理論上)更快 – JNK

+1

對於任何數字,它可能會更快。問題在於它是否值得進行折衷,這取決於它如何被索引,需要跳過多少額外的表格和邏輯循環,因爲這個數字從3變大,需要多少額外的維護對於N個表格等。通過適當的索引和分區的可能性,這種設計模式應該大部分已經滅絕。 –

+0

@JNK:只有OP只請求具有'k'的唯一值的FOOK。如果不是,則需要2個查詢+一個聯合,這會比#WHERE查詢慢。 –

回答

2

尚北道 - 不 - 執行 - 但─

哦,等等,這是沒有幫助的,它只是beligerant :)


以這種方式分割數據產量性能優勢。但他們也推出其他費用:
- 需要跨越所有三個表變得更加複雜
查詢 - 你的架構變得更加混亂
- 它很容易犯錯誤
- 這是很難保證引用完整性
- 你可能需要包括一個視圖統一3個表


您是最有可能的是在其內具有k索引好得多。根據你如何查詢數據,k可能是該指數中的第一個字段。當您指定k = ?時,只需要在索引中進行快速檢查,然後您只查看錶格的相關部分。而且,如果索引是clustered索引,則數據甚至以該順序物理存儲。


我會強烈建議分區數據之​​前進行索引的使用這種方式。這是對成本的優化,所以應該在需要時予以處理,而不是在設計之初作爲安全網。

+0

所以如果k有一個聚集索引,它是一樣的? – Omu

+0

如果有一個聚集索引,其中k爲索引中的第一個字段,則數據將在物理上排序,首先k = 1,然後k = 2,依此類推。當查詢'WHERE k = 2'時,第一步是查找k = 2覆蓋的範圍,確實是非常快的一步。 – MatBailie

5

潛在的,使用多個表可能比使用單個表(特別是如果這些表將擁有數百萬的記錄)速度更快,但會有取捨在易用性方面,可管理性等。

但是,您可以通過partitioning your table得到兩者的好處。

+2

Partioning在這裏是答案,它隱藏了複雜性。 – Johan

+0

我同意分區就是答案。我只是想爲使用TABLE INHERITANCE投票,如果你的數據庫支持它,它也可以隱藏物理實現,並保持這個決定對最終用戶相對透明。 –

1

它可能取決於數據庫,所以需要一個真實的例子。例如,在Oracle中,您可以使用分區,這與您在窗簾背後說的完全一致,或者使用聯合創建實體化視圖,然後可以選擇執行這兩個操作。 通常,我會說你應該創建一個正確的實現,然後調整;早期優化是所有弊端的根源,尤其是DB。我認爲你的瓶頸很可能不會在你期望的地方。