繁体   English   中英

更新十亿行表

[英]Updating billion rows table

我们的表有十亿行。 我们只想将所有行的两列更新为NULL。 我们正在尝试分批执行此操作。 但是,我们担心性能问题。 我们在此表上具有聚集的列存储索引。 在这三列上创建复合非聚集索引是否有帮助? 还是可以将表重新加载到新表并交换表?

任何输入将非常有帮助。

DECLARE @notNULLRecordsCount INT; 

SET @notNULLRecordsCount = 1;

WHILE @notNULLRecordsCount > 0 
    BEGIN 
    BEGIN TRANSACTION;

    UPDATE  TOP (100000)
    dbo.BillionRowsTable
    SET     Column1 = NULL,
            Column2 = NULL,
            Column3 = NULL     
    WHERE   Column1 IS NOT NULL OR Column2 IS NOT NULL OR Column3 IS NOT NULL;


SET @notNULLRecordsCount = @@ROWCOUNT;
COMMIT TRANSACTION;
END 

我的经验是,由于必须维护索引,因此索引实际上会使速度变慢。

放开交易是不好的。 在交易中包装所有这些都是不好的。 如果您打算将它们全部包装在一个事务中,则没有任何目的将它们分解。

如果您只能键入一列(否or ),那将会更快。

你可以缩短这个

select 1;
WHILE @@ROWCOUNT > 0 
BEGIN 
    UPDATE  TOP (100000)
    dbo.BillionRowsTable
    SET     Column1 = NULL,
            Column2 = NULL,
            Column3 = NULL     
    WHERE   Column1 IS NOT NULL 
         OR Column2 IS NOT NULL 
         OR Column3 IS NOT NULL
END

摆脱or

select 1;
WHILE @@ROWCOUNT > 0 
BEGIN 
    UPDATE  TOP (100000)
    dbo.BillionRowsTable
    SET     Column1 = NULL,
            Column2 = NULL,
            Column3 = NULL     
    WHERE   Column1 IS NOT NULL
END

select 1;
WHILE @@ROWCOUNT > 0 
BEGIN 
    UPDATE  TOP (100000)
    dbo.BillionRowsTable
    SET     Column2 = NULL,
            Column3 = NULL     
    WHERE   Column2 IS NOT NULL
END

select 1;
WHILE @@ROWCOUNT > 0 
BEGIN 
    UPDATE  TOP (100000)
    dbo.BillionRowsTable
    SET     Column3 = NULL     
    WHERE   Column3 IS NOT NULL
END

感谢@Paparazzo的建议,我们决定使用单列将其作为两个阶段的UPDATE进行。 我们一次使用Column1作为NULL,另一次使用Column1作为NOT NULL,以便覆盖所有行。

select 1;
WHILE @@ROWCOUNT > 0 
BEGIN 
BEGIN TRANSACTION;
    UPDATE  TOP (100000)
    dbo.BillionRowsTable
    SET     Column2 = NULL,
            Column3 = NULL     
    WHERE   Column1 IS NULL;
COMMIT TRANSACTION;
END

select 1;
WHILE @@ROWCOUNT > 0 
BEGIN 
BEGIN TRANSACTION;
    UPDATE  TOP (100000)
    dbo.BillionRowsTable
    SET     Column1= NULL,
            Column2 = NULL,
            Column3 = NULL     
    WHERE   Column1 IS NOT NULL;
COMMIT TRANSACTION;
END

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM