对于性能,哪个选项对于要更新的大型数据集会更好?
使用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个
答案 0 :(得分:15)
CASE
版本。
这是因为您很有可能使用单个语句多次更改同一行。如果第10行同时包含condition_1
和condition_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)
依旧......
这样可以在扩展大量更新的同时为您提供良好的性能。