SQL UPDATE TOP () 或 UPDATE 与 SELECT TOP

Posted

技术标签:

【中文标题】SQL UPDATE TOP () 或 UPDATE 与 SELECT TOP【英文标题】:SQL UPDATE TOP () or UPDATE with SELECT TOP 【发布时间】:2017-02-01 10:43:05 【问题描述】:

我有几千条记录,我需要分批更新它们,每批 350 条记录。

我想知道以下两个更新语句是否有任何区别,如果其中一个会更快,使用更少的数据库资源等。

声明 1:

UPDATE TOP (350) database1
SET value1 = '', value2 ='', value3 = ''
WHERE value1 = '123'

声明 2:

    UPDATE database1
    SET value1 = '', value2 ='', value3 = ''
    WHERE ID in 
       (SELECT TOP 350 ID FROM database1
       WHERE value1 = '123')

【问题讨论】:

第二个语句比较慢,我最近测试了这个:-) 是的,前 150 条记录是随机选择的。两个查询中更新的记录可能不同 几千条记录?真的需要分批做吗? 【参考方案1】:

第一个语句会更快。但是前 150 条记录是随机选择的。两个查询中更新的记录可能不同。由于您将更新分成批次,因此您的方法可能不会更新所有记录。

我将使用以下一致的方法而不是您的方法来做到这一点。

;WITH cte
     AS (SELECT TOP (350) value1,
                          value2,
                          value3
         FROM   database1
         WHERE  value1 = '123'
         ORDER  BY ID -- or any other column to order the result 
        )
UPDATE cte
SET    value1 = '',
       value2 = '',
       value3 = '' 

此外,您在更新数千条记录时不必担心事务日志的大小这里不需要批处理

【讨论】:

【参考方案2】:

从database1过滤数据,然后按id加入。以下方法更适合选择和更新数据。

UPDATE database1 
    SET value1 = '', value2 ='', value3 = ''
    FROM (
        SELECT top 350 ID
        FROM database1
        WHERE value1 = '123'
        ) as db1
    WHERE db1.ID = database1.ID

【讨论】:

以上是关于SQL UPDATE TOP () 或 UPDATE 与 SELECT TOP的主要内容,如果未能解决你的问题,请参考以下文章

SQL Update TOP Update Order by 和output的使用

基于 TOP 的 SQL UPDATE

mysql update 正在更新所有行而不是一个

SQL 触发器

linux下执行yum updat 无效果,这是啥情况?

在 Hibernate/JPA Generated UPDATE Query 的 Where 子句中包含附加列