2010-11-13 67 views
0

我們擁有包含50多個數據字段和多個國家/地區特定產品代碼的大型(2M +行)產品數據表。我希望能夠從ProductData有效地加入基於不同代碼字段的不同查找表。我們目前使用單獨但非常類似的SP來實現邏輯,並且在更改時導致版本問題。 SP本身通常是200-500行實現複雜邏輯的行,95%的邏輯是通用的,但大多數連接語句都是特定於國家/地區的。基於查詢加入兩個不同的表格

在僞SQL的簡化版本看起來像這樣

ProductTable Schema 
Id, Data1, Data2, .... , ProductCodeUK, ProductCodeUSA, ProductJapan 

SP1_USA 
select Id, Data, Data, LookupUSA.Price As Price from ProductTable 
join LookupUSA on ProductTable.ProductCodeUSA = LookupUSA.Code 


SP2_UK 
select Id, Data, Data, LookupUK.Price As Price from ProductTable 
join LookupUK on ProductTable.CodeVersion2 = LookupUK.ProductCodeUK 

注意代碼值經常反覆在不同國家之間,所以我們不能輕易合併的查找表一起。

回答

3

你的問題是你的模式設計的很糟糕。您需要標準化的:

ProductCodeUK, ProductCodeUSA, ProductCodeJapan, ProductCodeGermany, ... 

您應將此數據移動到新的表有三列,其中之一是一個外鍵返回到原來的表:

Product CountryCode ProductCode 

和你的查找表應該是這樣的:

CountryCode ProductCode Price .... 

有了這個新設計的加入都是一樣的。要選擇不同的國家,您現在只需要修改WHERE子句中的參數。

+0

+1:這是組織這個的正確方法。 – 2010-11-13 22:26:24

+0

當我們嘗試這種方法時,我們獲得了很大的性能提升,因此按照現在的模式進行。由於查找表有不同的列,因此我們可以將這些問題標準化,但在某些情況下,我們會加入4個表格 – MrTelly 2010-11-14 23:20:40

+0

@MrTelly:我懷疑您看到的「性能問題」是要麼是由於寫入的查詢效率低下,要麼是因爲缺少索引。檢查EXPLAIN並調整查詢和/或索引,直到性能得到改進。至於查找表中的差異 - 這是一個棘手的問題要解決。如果不瞭解更多關於這些表格的具體情況,我無法真正對此發表評論。除了改變模式之外,我唯一能想到的其他事情就是使用一個視圖來封裝重複的邏輯 - 但它似乎無法幫助您查看您在示例中提供的查詢。 – 2010-11-14 23:34:25