我有两个表FACT_SALE
和DIM_PRODUCT
,它们的产品名称都是通用的,我想将DIM_PRODUCT
的ID设置为外键。使用DIM_PRODUCT
表的不同名称值创建FACT_SALE
。
UPDATE FACT_SALE FS
JOIN DIM_PRODUCT DP ON FS.PRODUCT_NAME = DP.NAME
SET FS.PRODUCT_KEY = DP.ID
我写的这个查询永远运行,数据库中也没有反映出任何变化。 FACT_SALE table
中只有十万条记录(10万)。但是,如果我使用Joining two table运行一个select查询,它会快速运行。
我可以知道这个问题的根本原因是什么吗?
答案 0 :(得分:4)
对于此查询:
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);
答案 1 :(得分:1)
您是否有任何一个加入列FACT_SALE.PRODUCT_NAME
或DIM_PRODUCT.NAME
的索引?如果您在其中任何一列上都有索引可能会降低更新速度,因为索引必须与数据一起更新。
从this SO question开始,索引只会使WHERE
子句中的列受益。但是,由于您没有WHERE
子句,索引可能会受到伤害而无法帮助。
答案 2 :(得分: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
子句在列上创建索引。