更新SQL的更好方法

时间:2014-07-11 04:13:22

标签: sql sql-server tsql

我们正在进行一些数据集成,并以

的形式获得更新脚本
UPDATE Table1 SET Table1.field1 = '12345' WHERE Table1.field2 = '345667';
UPDATE Table1 SET Table1.field1 = '12365' WHERE Table1.field2 = '567885';

Table1.field2未编入索引。

脚本运行没有问题,但它需要永远。在7分钟内有8000行受到影响,我觉得有点长。 (它在不是最好的开发服务器上运行,但是查看服务器并不表示它过于繁忙。)

所以我的问题是,有没有更好的方法(即更快)来运行这种类型的更新语句。 (SQL 2008 R2)

非常感谢!

2 个答案:

答案 0 :(得分:1)

正如我所看到的,你可以尝试不同的东西(比如将所有值存储在另一个表上,然后使用另一个表更新一个),但最后,引擎将使用单个字段进行搜索,测试与值。

这需要索引。如果你至少可以在dev中测试,也许你可以向那些可以在生产环境中授权创建新索引的人展示性能改进。

这是我的答案,我希望有人想出一个更好的答案!

答案 1 :(得分:1)

您可能正在使用多个UPDATE语句对服务器进行RBAR(逐行)。从本质上讲,您需要对每个查询进行表扫描,这显然是不理想的。虽然索引可以帮助最多,但执行多个单值语句仍然会花费你。

SQL Server允许您将JOIN用于更新语句,因此您可能会看到一些改进,例如:

WITH Incoming AS (SELECT field1, field2
                  FROM (VALUES('12345', '345667'),
                              ('12365', '567885')) i(field1, field2))
UPDATE Table1
SET Table1.field1 = Incoming.field1
FROM Table1
JOIN Incoming
  ON Incoming.field2 = Table1.field2;

SQL Fiddle Example

如果事实证明Incoming中的行数很大,您应该将其视为一个实际的表,然后将其批量加载到第一个。您应该能够在加载表上放置一个索引(在导入后刷新,以确保统计信息正确)。

但实际上,field2上的索引应该是第一件事,特别是如果有多个查询使用该列。