2017-08-08 64 views
0

我有兩個表FACT_SALEDIM_PRODUCT二者均具有產品名稱通用,我想設置DIM_PRODUCT的ID作爲外鍵。使用FACT_SALE表的不同名稱值創建了DIM_PRODUCT加入和更新需要太長時間

UPDATE FACT_SALE FS 
JOIN DIM_PRODUCT DP ON FS.PRODUCT_NAME = DP.NAME 
SET FS.PRODUCT_KEY = DP.ID 

我寫的這個查詢會永遠運行,也不會反映在數據庫中。 FACT_SALE table中只有10萬條記錄(100 000)。但是如果我通過連接兩個表運行選擇查詢,它可以快速運行。

我能知道什麼是根本原因這個問題?

+1

您的加盟條件是文本字段,我懷疑這個領域沒有被索引,增加索引的字段名稱可能會使方式更快捷,所以只是一個測試備份你的數據庫,然後添加索引字段FS.PRODUCT_NAME和DP.NAME然後測試您的更新。 –

回答

3

對於此查詢:

UPDATE FACT_SALE FS JOIN 
     DIM_PRODUCT DP 
     ON FS.PRODUCT_NAME = DP.NAME 
SET FS.PRODUCT_KEY = DP.ID ; 

你想在DIM_PRODUCT(NAME, ID)指數:

所有的
CREATE INDEX IDX_DIM_PRODUCT_NAME_ID ON DIM_PRODUCT(NAME, ID); 
+0

我真的責令閱讀你的答案 – Ali

+0

@Ali我也喜歡戈登的工作......總是一個很好的時間對堆棧溢出^^ –

+0

由於工作就像一個魅力。如果我能得到一個資源頁面,知道爲什麼選擇連接和更新連接中存在巨大差異(如20-30倍),那將非常棒。 :)。更新是否以更復雜的方式執行? –

0
UPDATE FACT_SALE FS 
INNER JOIN DIM_PRODUCT DP ON FS.PRODUCT_NAME = DP.NAME 
SET FS.PRODUCT_KEY = DP.ID 

首先,更換INNER JOIN加入。

第二件事,你必須創造出你正在使用ON子句中JOIN條件對列索引。

+2

'JOIN'在MySQL中默認爲'INNER JOIN'。另外,從[這個問題](https://stackoverflow.com/questions/6769941/do-mysql-update-queries-benefit-from-an-index)上連接列的索引可能傷害更新,而不是幫助它。 –

+0

@TimBiegeleisen是的,我明白你的觀點。有一行** where列的索引將加速更新,並選擇,但放慢一些插入。** –

1

你有任何的連接列FACT_SALE.PRODUCT_NAMEDIM_PRODUCT.NAME的指標?如果您在這些列中的任一列上都有索引,可能會降低更新速度,因爲索引必須隨數據一起更新。

this SO question指數將只有WHERE子句中受益列。但由於您沒有WHERE條款,因此索引可能會受到傷害,並且無助於您。