2013-02-26 77 views
0

就性能或查詢優化而言,不同表和類型列之間存在差異?性能類型化列x不同表

例如:

Create Table AllInOne(
    Key Integer Identity Primary Key, 
    Desc varchar(20) Not Null, 
    OneType Integer Not Null 
) 

凡OneType僅接收對戰以下結構1,2或3(整數值)

Create Table One(
    Key Integer Identity Primary Key, 
    Desc varchar(20) Not Null 
) 

Create Table Two(
    Key Integer Identity Primary Key, 
    Desc varchar(20) Not Null 
) 

Create Table Three(
    Key Integer Identity Primary Key, 
    Desc varchar(20) Not Null 
) 

另一種可能的結構:

Create Table Root(
    Key Integer Identity Primary Key, 
    Desc varchar(20) Not Null 
) 

Create Table One(
    Key Integer Primary Key references Root  
) 

Create Table Two(
    Key Integer Primary Key references Root  
) 

Create Table Three(
    Key Integer Primary Key references Root  
) 

在第三種方式中,所有數據都將設置在根和與一個,兩個和三個表的關係中。

我前幾天問過我的老師,如果有任何區別,他不能回答。我們假設我必須在這三種方法中進行選擇。
假設常用的查詢正在過濾該類型。並沒有引用這些表的子表。

爲了更容易理解,我們來考慮一下工資系統。
One = Incomings
兩個=折扣
三=計算基數。

+3

取決於您的查詢。除了表現之外,還有另一個(更嚴重的區別)。在第二種設計中,不能有引用「AllInOne」表的外鍵,您只能單獨引用任何3個表。另一種方式。 – 2013-02-26 13:32:28

+0

同意ypercube。如果你遵循這個論點來得出合乎邏輯的結論,那麼你只能在任何數據庫中有一張表,只是有很多列... – Paddy 2013-02-26 13:58:10

+0

@ypercube改寫了這個問題 – EProgrammerNotFound 2013-02-26 14:19:02

回答

1

具有單獨的表格(如(2)中所示)意味着需要訪問特定OneType數據的人員可以忽略其他類型的數據,從而減少表掃描的I/O。另外,(2)中表中的索引會更小並且可能更少,這意味着索引訪問的I/O更少。

鑑於OneType的高選擇性,索引無助於(1)中的過濾。但是,表分區可以用來獲得上面提到的所有好處。

還會有額外的好處。查詢(2)時,您需要知道需要哪個OneType才能知道要查詢哪個表。在(1)的分區版本中,不必要分區的分區消除可以通過where子句謂詞中提供的值來實現,這使得該過程變得更加容易。其他好處包括更簡單的數據庫管理(當您將列添加到分區表中時,它會被添加到所有分區中),更容易擴展(爲新的OneType值添加分區很容易)。另外,如前所述,該表可以被外鍵作爲目標。

+0

太棒了!對於甲骨文來說呢? – EProgrammerNotFound 2013-02-27 10:47:45

+0

你的意思是分區?是的,非常非常 – muhmud 2013-02-27 11:16:43