我的一位前同事写了以下UPDATE
作为数据导入脚本的一部分,在92k行的表格上完成需要将近15分钟。
UPDATE table
SET name = (
SELECT TOP 1 old_name FROM (
SELECT
SUM(r) rev,
number,
name,
intermediate_number,
intermediate_name,
old_number,
old_name
FROM table
GROUP BY
number,
name,
intermediate_number,
intermediate_name,
old_number,
old_name
) t
WHERE t.name = table.name
ORDER BY rev DESC
);
我确信它可以重写以提高效率,但我的所有尝试都失败了,或者没有产生相同的结果。
此外,表中未定义任何索引。建议表示赞赏。如果重要的话,我在Sybase iAnywhere 11上。
答案 0 :(得分:3)
在old_Name上放一个索引,看看它需要多长时间......
其次,在分析您的查询时,似乎可能存在缺陷。如果你看下面的重新格式化版本,
UPDATE table SET
name = (SELECT TOP 1 old_name
FROM (SELECT SUM(r) rev, number, name,
intermediate_number, intermediate_name,
old_number, old_name
FROM table
GROUP BY number, name, intermediate_number,
intermediate_name, old_number, old_name) t
WHERE t.old_name = table.old_name -- HERE
ORDER BY rev DESC);
第二行到最后一行 WHERE t.old_name = table.old_name 会导致内部子查询只有t.oldname =的行到外部的值查询table.old_name。因此,无论您是否执行Top 1都没关系,因为所有行都将具有相同的old_name值,您将始终将该值设置为它已经存在的值,不是吗?
编辑:(基于Where子句更改)试试这个:
UPDATE table SET
name = (SELECT Top 1 old_name
FROM table it
Where it.name = table.old_name
GROUP BY number, intermediate_number,
intermediate_name, old_number, old_name
Order By SUM(r) Desc);
答案 1 :(得分:0)
我不是Sybase的人,但是我会按照以下方式进行。
Pseudo Sql
DECLARE @tempTable TABLE --In memory table if possible
INSERT INTO @tempTable
SELECT
SUM(r) rev,
number,
name,
intermediate_number,
intermediate_name,
old_number,
old_name
FROM table
GROUP BY
number,
name,
intermediate_number,
intermediate_name,
old_number,
old_namet
ORDER BY rev DESC
UPDATE table
SET name = SELECT TOP 1 old_name FROM @tempTable t WHERE t.old_name = table.old_name
这应该消除你的递归SELECT