0

我正在尝试将一些数据从数据库移动到另一个。我的数据库中目前有超过一百万个条目,我预计这需要很长时间,但已经过了 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;

欢迎任何有关如何改进此查询的帮助。提前致谢!

4

2 回答 2

2

p.model_view, l.ARL_SEARCH_NUMBER 上的索引,如果你不想摆脱 JOIN。
实际上,它可能会根据实际数据量及其值(NULL 存在)通过以下方式进行优化:
1. 监控查询执行计划,如果不好,则为编译器提供查询提示或为子查询交换 JOIN,以便编译器使用另一种类型加入其中(合并/嵌套循环/散列/其他)
2. 使用更复杂但更快的逻辑创建存储过程
3. 小部分进行更新

于 2013-11-12T12:21:36.027 回答
1

确定是什么导致缓慢。

检查 JOIN 是否优化

仅运行 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。

如果 JOIN 一切正常,那么更新行很慢。这种情况很难让事情变得更快。

更新 = 删除和插入

我没有试过这个。但有时,这种策略更快...... UPDATE是删除旧行并使用新值插入新行。

// 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 值均匀分布表很重要。直方图可以帮助你。获取直方图的数据

于 2013-11-12T12:34:35.320 回答