我正在尝试将一些数据从数据库移动到另一个数据库。我目前在我的数据库中有超过一百万个条目,我期待这需要很长时间,但已经过了50分钟,没有结果:)。 这是我的疑问:
UPDATE xxx.product AS p
LEFT JOIN xx.tof_art_lookup AS l ON p.model_view = l.ARL_SEARCH_NUMBER
SET p.model = l.ARL_DISPLAY_NR
WHERE p.model_view = l.ARL_SEARCH_NUMBER;
欢迎任何有关如何改进此查询的帮助。提前谢谢!
答案 0 :(得分:2)
p.model_view上的索引,如果你不想摆脱JOIN,那么l.ARL_SEARCH_NUMBER。
实际上,可以根据实际数据量及其值(NULL存在)进行优化,使用:
1.监视查询执行计划,如果不好,则为编译器提供查询提示或为子查询交换JOIN,以便编译器在其中使用其他类型的连接(merge / nested loops / hashs / whatever)
2.使存储过程具有更复杂但更快的逻辑
3.按小部分进行更新
答案 1 :(得分:1)
找出缓慢的原因。
仅运行SELECT:
SELECT COUNT(*)
FROM xxx.product p LEFT JOIN xx.tof_art_lookup l
ON p.model_view = l.ARL_SEARCH_NUMBER;
需要多长时间? EXPLAIN SELECT ...
检查正确INDEX
是否用于加入。
如果JOIN的一切正常,那么UPDATEING行很慢。这种情况很难让事情变得更快。
我没试过这个。但有时候,这个策略更快.. UPDATE
是DELETE旧行,使用新值INSERT新行。
// CREATE new table and INSERT
CREATE TABLE xxx.new_product
SELECT p.model_model, l. ARL_DISPLAY_NR, ...
FROM xxx.product p LEFT JOIN xx.tof_art_lookup l
ON p.model_view = l.ARL_SEARCH_NUMBER;
// drop xxx.procuct
// rename xxx.new_product to xxx.product
我认为你的工作是CPU限制的,你的UPDATE查询只使用一个CPU就不会有很多核心。 xxx.product TABLE没有连接约束,有1M行按顺序更新
我的建议如下。
给xxx.product一些条件,使xxx.product划分为20组。 (我不认为哪一栏对你更好,因为我没有关于xxx.product的信息)
然后同时运行20个查询。
例如:
// for 1st chunk
UPDATE xxx.product AS p
...
WHERE p.model_view = l.ARL_SEARCH_NUMBER
AND p.column BETWEEN val1 AND val2; <= this condition spliting xxx.product
// for 2nd chunk
UPDATE xxx.product AS p
...
WHERE p.model_view = l.ARL_SEARCH_NUMBER
AND p.column BETWEEN val2 AND val3;
...
...
// for 20th chunk
UPDATE xxx.product AS p
...
WHERE p.model_view = l.ARL_SEARCH_NUMBER
AND p.column BETWEEN val19 AND val20;
重要的是要均匀地找到BETWEEN值分配表。直方图可以帮助你。 Getting data for histogram plot