2010-10-28 53 views
1

我有一個表(2萬行)中的Informix V11.10,複製(50+節點)環境SQL遷移到垂直記錄

基本佈局就像這樣:
ID(PK)(INT)
除法(INT)
公司(INT)
特徵1炭(20)
特徵2 INT
...
特徵200字符(2)

有一個關於當前佈局有幾個問題: 有200個與此記錄相關的「特徵」,但是在任何給定時間可能有5-10個特徵不是默認值/空值(對於每個記錄不同)。

到一家公司的所有記錄的更新有時就意味着更新100K行這扼流圈複製,不容易管理。

所以我做了更改,像這樣的表:
ID(INT)
ID_TYPE(ID,部門或公司)
FEATURE_NAME
FEATURE_VALUE

而且還有另外一個表只:
ID(INT)
師(INT)
公司(INT)

所以對於發言權ID#1竟被存在d表中有10行,相關部門可能有幾條記錄,公司可能有幾條記錄。 ID記錄將「覆蓋」具有與分部相匹配的相同feature_name的任何記錄,並且分部將覆蓋任何公司。

我創建了一個函數,當你在ID傳遞和FEATURE_NAME它查詢根據公司,然後查詢上分裂,然後根據ID,並返回基於上述取代邏輯的特徵值。 (基本上有序foreach循環)

然後創建看起來像的視圖:
選擇
my_func,並將(特徵1,ID)作爲特徵1
my_func,並將(特徵2,ID)作爲特徵2
...
my_func,並將(feature200,ID)as feature200
from

現在的問題是,我打到表200 * 3(對於ID,公司,部門)時間爲每個功能,只是不工作,它的問題釘住CPU。新的記錄數量約爲2000萬,佔用的空間少得多。

有什麼想法?我覺得我錯過了在某個地方使用臨時表的情況,這使得它不需要在2000萬行的表上打600次。

回答

1

你不應該打你的表200 * 3的每個功能,但對於您的視圖中的每一行 - 這是因爲你的視圖包含200元話費,以my_func,並將每行(每個要素之一)。

這引出了一個問題:您是否曾經需要同時訪問所有200個功能?從問題中所寫的內容來看,好像任何給定的ID可能只使用一小部分功能 - 針對特定功能的任何查詢都可能直接訪問my_func(而不是通過視圖)特徵。

另一方面,在必須檢索所有200個功能的情況下,基於200次對my_func調用的視圖將保證檢索每行600個邏輯訪問。相反,我建議重寫視圖以直接訪問特徵表,按ID分組,並使用由MAX(CASE WHEN ... type結構派生的每個特徵進行分組。這仍然會導致600個物理行被讀取,但最多隻有3個邏輯讀取,對於每個視圖行返回 - 我希望這會顯着改善。

+0

是的不幸的是,由於許多傳統程序擊中此表,我將始終需要這200個可見的功能。 – user490231 2010-10-28 16:20:51

+0

因此,請嘗試重寫視圖以直接訪問特徵表(如上所述),並比較結果的性能。 – 2010-10-28 16:22:55

0

我的常識告訴我你應該規範化爲兩個單獨的表。