2017-08-08 62 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条款,因此索引可能会受到伤害,并且无助于您。