sql - 大表上的简单 UPDATE 查询性能较差

标签 sql sql-server stored-procedures azure-sql-database

我需要通过存储过程执行以下更新查询:

UPDATE table1
SET name = @name (this is the stored procedure inputparameter)
WHERE name IS NULL

Table1 没有索引或键,5 列,其中 4 个整数和 1 个 varchar(可更新列“name”是 varchar 列)

NULL 记录大约有 15.000.000 行需要更新。这大约需要 50 分钟,我认为这太长了。

我正在运行 Azure SQL DB 标准 S6(400DTU)。

有人可以给我提高性能的建议吗?

最佳答案

由于您没有任何键或索引,我可以建议采用以下方法。

1- 使用 INTO 创建一个新表(这将复制数据),如以下查询。

  SELECT 
       CASE 
              WHEN NAME IS NULL THEN @name 
              ELSE NAME 
       END AS NAME, 
       <other columns > 
INTO   dbo.newtable
FROM table1

2-删除旧表

drop table table1

3-将新表重命名为table1

exec sp_rename 'dbo.newtable', 'table1'

另一种方法可以使用批量更新,有时与批量更新相比,您可以获得更好的性能(您需要通过调整批量大小进行测试)。

WHILE EXISTS (SELECT 1 FROM table1 WHERE name is null)
BEGIN
    UPDATE TOP (10000) table1
    SET name = @name
    WHERE n ame is null
END

关于sql - 大表上的简单 UPDATE 查询性能较差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54900128/

相关文章:

MySQL存储过程循环增量日期选择查询返回最后日期

php - 根据 id 匹配使用另一个表中的值更新一个 MySQL 表

SQL 多条件 CTE 递归

SQL Server 05,这是最佳的,LIKE %<term>% 或 CONTAINS() 用于搜索大列

SQL 添加日期时间 添加小时和分钟

sql-server - Sailsjs 与 Sails-SqlServer 和 Waterline ORM

mysql - 获取mysql列值到行

SQL获取每个类别的计数

c# - SQL Server 存储过程返回值,并在 C# 中使用

php - 如何使用phpmyadmin编写存储过程以及如何通过php使用?