CASE与大数据集的多个UPDATE查询 - 性能

时间:2012-03-26 15:38:11

标签: sql performance postgresql case sql-update

对于性能,哪个选项对于要更新的​​大型数据集会更好?

使用CASE语句或个人更新查询?

CASE示例:

UPDATE tbl_name SET field_name = 
CASE
    WHEN condition_1 THEN 'Blah'
    WHEN condition_2 THEN 'Foo'
    WHEN condition_x THEN 123
    ELSE 'bar'
END AS value

个人查询示例:

UPDATE tbl_name SET field_name = 'Blah' WHERE field_name = condition_1
UPDATE tbl_name SET field_name = 'Foo' WHERE field_name = condition_2
UPDATE tbl_name SET field_name = 123 WHERE field_name = condition_x
UPDATE tbl_name SET field_name = 'bar' WHERE field_name = condition_y

注意:将更新大约300,000条记录,CASE语句将有大约10,000条WHEN条件。如果使用单个查询,它也是大约10,000个

3 个答案:

答案 0 :(得分:15)

CASE版本。

这是因为您很有可能使用单个语句多次更改同一行。如果第10行同时包含condition_1condition_y,则需要读取并更改两次。如果您有聚簇索引,则意味着在修改的其他字段之外的两个聚簇索引更新。

如果您可以将其作为单个语句执行,则每行只读一次,并且运行速度要快得多。

我在大约一年前改变了一个类似的过程,按顺序使用了几十个UPDATE语句,使用UPDATE CASE {{1}},处理时间减少了约80%。

答案 1 :(得分:0)

对我来说,似乎逻辑上,在第一个选项上SQL Server将只通过一次表,对于每一行,它将评估条件。

第二,它必须经过所有表4次

因此,对于一个包含1000行的表,在最佳案例场景的第一个选项中,我们讨论的是1000个评估,最差的情况是3000。 在第二个,我们将总是有4000个评估

因此选项1会更快。

答案 2 :(得分:0)

正如Mitch所指出的那样,尝试使用所需的所有数据制作临时表,为要更改的每个列(字段)创建不同的临时表。您还应该为临时表添加索引,以提高性能。

这样你的更新语句变得(或多或少):

UPDATE tbl_name SET field_name = COALESCE((SELECT value FROM temp_tbl WHERE tbl_name.conditional_field = temp_tbl.condition_value), field_name),
    field_name2 = COALESCE((SELECT value FROM temp_tbl2 WHERE tbl_name.conditional_field2 = temp_tbl2.condition_value), field_name2)

依旧......

这样可以在扩展大量更新的同时为您提供良好的性能。