2013-02-12 33 views
1

我知道對於像Postgresql這樣的關係型數據庫,使用分隔表格會更有效,但我關心的是性能問題,因爲執行最多的查詢將使用UNION ALL從多個表中獲取行。使用UNION ALL從多個表中獲取行或在生產中使用一個表?

我必須選擇處理這個問題。第一個是:

table1 -> column1, column2 
table2 -> column1, column2 
table3 -> column1, column2, column3 

在該解決方案我必須使用3種不同的查詢合併在生產UNION ALL和該查詢將執行記錄在系統(該系統中所執行查詢)

用戶

另一個是:

table -> column1, column2, typeColumn, extraColumnForTable3 

在該溶液我要創建一個額外的列typeColumn區分行是哪種類型。而且我還必須爲類型table3創建一個列extraColumnForTable3,對於table2table1類型,它將爲NULL。在此解決方案中,執行最多的查詢將只包含一條SELECT聲明。

生產中會有數百萬行,所以我關心性能。 NULL值可能會佔用數據庫中的額外空間,但我認爲它可以忽略不計。我將使用消除NULL值的部分索引,所以我不認爲這會影響其他提取特定類型的查詢。你認爲哪一個生產效率更高?

+2

「分隔桌子」?分離是[規範化](http://en.wikipedia.org/wiki/Database_normalization)的結果。如果執行得最多的查詢執行該聯合,那麼很可能您的數據結構不是傳統意義上的標準化,而是您只有代表同一事物的專業化的表格,而不是表示泛型和專業化的表格包含對通用中該行的引用。 – Matt 2013-02-13 19:18:50

回答

0

一般來說,我發現大量使用UNION表明數據庫設計不好。有些情況下,UNIONUNION ALL是有意義的,但它們在遞歸公用表表達式之外應該比較少見。

PostgreSQL爲保持單個表上的性能可管理提供了相當多的選項,並且您指出部分索引是管理此問題的好方法。

分解表的主要問題是這種陳述很常見,這是因爲它使得主鍵和外鍵管理相當成問題。總的來說,確保您的數據結構首先是清晰可管理的,然後擔心優化,而不是擔心優化,然後嘗試使優化的解決方案易於管理,這幾乎總是好得多。

相關問題