CURSOR与UPDATE(CURSOR vs. UPDATE)

2019-10-19 05:53发布

一个公司使用SQL Server数据库来存储它的客户和业务事务的信息。 新区号已经出台了你的城市。 区号111保持与前缀是小于500的数字与前缀是500和更大的将被分配在客户表中电话列中的所有电话号被存储为222的区域码相同的电话号码以下格式,“999-999-9999”的炭(12)的字符串。 我必须对Customers表进行相应的更改

尽可能快地使用最少的管理工作。 我应该使用哪一个?

一种。

UPDATE Customers SET Phone = ‘222-‘ + SUBSTRING(Phone,5,8) 
FROM Customers WHERE SUBSTRING(Phone,1,3) = ‘111’ 
AND SUBSTRING(Phone,5,3) >= 500 

DECLARE PhoneCursor CURSOR FOR 
   SELECT Phone FROM Customers 
   WHERE SUBSTRING(Phone,1,3) = 111 
     AND SUBSTRING(Phone,5,3) >= 500 

OPEN PhoneCursor 
FETCH NEXT FROM PhoneCursor 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    UPDATE Customers 
    SET Phone = ‘222’ + SUBSTRING(Phone,5,8) 
    WHERE CURRENT OF PhoneCursor 

    FETCH NEXT FROM PhoneCursor 
END 

CLOSE PhoneCursor 
DEALLOCATE PhoneCursor 

Answer 1:

大更新将针对数据库持有交易的,潜在的,时间长了...锁定的事情了,并造成各种破坏的。

对于这一点,我会建议光标散播载出一段时间。

我也做了“分块”更新中...是这样的:

DECLARE @Done bit = 0
WHILE @Done = 0
BEGIN
    UPDATE TOP(10000)
        Customers SET Phone = ‘222-‘ + SUBSTRING(Phone,5,8) 
    FROM Customers WHERE SUBSTRING(Phone,1,3) = ‘111’ 
    AND SUBSTRING(Phone,5,3) >= 500 

    IF @@ROWCOUNT = 0
    BEGIN
        SET @Done = 1
    END
END


Answer 2:

光标会在任何大型数据集是慢得多,谈论小时副秒或毫秒。 它的作用在任何一个时间不锁定其他用户的数据库,只要。

这就是为什么有一个大的数据集,该批次的方法可以是最好的。

一般来说,我会首先尝试基于集合的方法和运行下班时间如果需要的话。 然后,我会尝试它运行一个批处理的记录只有当一套基于太慢基于集合的方法。

如果你必须去光标运行在一个时间记录,那么就可能有大量错了你的数据库设计。 光标通常是不得已而为之的办法。 不要将它们用于插入/更新或删除。



文章来源: CURSOR vs. UPDATE