2011-01-31 103 views
3

我有20多個配套設置以下方式的SQL Server 2008性能調整(T-SQL)中的多個LEFT JOIN表與視圖

[common_column1, common_column2, unique_column] 

我需要拿出一個合併表或視圖表這將設置像這樣

我在每個支持表中有600萬+記錄。我的組合表/視圖創建查詢看起來是這樣的:

select 
    a.common_column1, a.common_column2, a.unique_column, b.unique_column, 
    c.unique_column, d.... 
into combined_table 
from table1 as a 
left join table2 as b on (a.common_column1 = b.common_column1 and a.common_column2 = b.common_column2) 
left join table3 as c on (a.common_column1 = c.common_column1 and a.common_column2 = c.common_column2) 
left join table4 as d ...` 

我的主要目的是對合並表/視圖,我將在所有領域進行查詢多次最佳讀取性能。您能否提出一些更好的建議:創建一個組合表並將索引放到每一列上或將索引放到每個支持表的每個公共列上,然後創建一個組合視圖?或者有其他方法可以實現我的目標嗎?

回答

2

如果您沒有LEFT JOIN,您可以調查索引視圖 - 但是,由於您離開了這些聯接,這些都不存在問題。

使用LEFT JOIN是混亂和昂貴的 - 而且也確實沒有太多的「神奇」來加速這個了。

只需確保在您在連接使用子表上的每個索引,並且每外鍵列(S),並在WHERE條款(S)在列 - 這是關於你可以做,恐怕...

但請注意:太多的指數可能比沒有指數更糟...認真挑選它們!

+0

感謝您的反饋意見。我想我可以探索調整子表中的數據以擺脫LEFT JOINS並用組合視圖/表中的INNER JOINS替換它們。如果我更改爲INNER JOINS,那麼您認爲組合索引視圖的讀取速度會比組合表與插入子表的所有記錄的組合表讀取速度更慢或更快? – 2011-02-01 15:36:03

+0

@Greg Kostrikin:如果你能創建一個索引視圖,那通常會比常規視圖快得多 - 這絕對值得研究!然而,你會說, – 2011-02-01 17:01:11

0

視圖與選擇相同 - 它對性能沒有影響,但通常更容易管理。
至於組合表是否會更快,很難說沒有看到您試圖運行的查詢。
順便說一句,索引每一列不太可能有用。索引連接列很可能。索引「where」子句中使用的列也可能有幫助。
你爲什麼不發佈你的查詢,我們來看看。

0

在每個支承臺創建一個覆蓋索引:

CREATE INDEX ix_b_1_2_unique ON b (common_column1, common_column2) INCLUDE (unique_column) 

請注意,此查詢是可行的,共同的列也應該幾乎是獨一無二的。

如果您在每個表格中都有重複的(common_column1, common_column2),它將返回a中每個對的1048576記錄。

你能否透露你的模型多一點?你確定你需要加入,而不是工會?