簡體   English   中英

SQL Server-需要用十億條記錄回填表中的一列

[英]SQL Server - Need to backfill a column in a table with a billion records

我需要在具有十億條記錄的現有sql服務器表(A)中回填datetime列。 我在主鍵(ID)上將目標表(A)與父表(B)聯接在一起,然后檢索日期。 不幸的是,我在日期列上沒有索引,這導致更新非常慢。 我無法在“日期”列(包括ID)上創建索引,因為在線索引創建已耗盡整個日志(最大150gb),並且offine索引構建超出范圍。

UPDATE  A
    SET A.DATE = ZZ.DATE
FROM    A
        INNER JOIN
        (SELECT TOP 100000 A.ID,
                           B.DATE
         FROM   A WITH (NOLOCK)
                INNER JOIN
                B WITH (NOLOCK)
                -- parent table
                ON A.ID = B.ID
         WHERE  A.DATE IS NULL) AS ZZ
        ON ZZ.ID = A.ID;

任何專家建議以更快或更有效的方式執行回填。

謝謝

聽起來像是分塊更新的情況。 順便說一下,最近在這個主題上寫了一篇非常詳盡的文章( http://www.sqlperformance.com/2013/03/io-subsystem/chunk-deletes )。 它處理日志管理問題。

基本上,您應該將所做的更新分成盡可能大的批處理,而又不會引起過多的日志使用。 您可以拆分為A(A.ID的更新范圍),也可以拆分為b(根據在B上建立索引的某個數據范圍(例如,聚集索引或任何其他索引)從B抽取數據。

您可以使用WHERE ID BETWEEN @a AND @b選擇行范圍。 如果對ID進行索引,則可以避免進行表掃描,並且可以進行增量數據提取。

請嘗試以下代碼,它刪除了一次內部聯接,並按批提交。 刪除一次性哈希聯接可能對您沒有太大幫助,但值得一試。

另一件事是,您提到您不能進行在線索引創建,可以進行在線索引更新/重建,可以將日期列添加到ID上的群集索引中,並在群集索引中包含[日期] 。 由於在我的查詢中,where子句以ID為條件,以及[date]為條件,因此,如果可以將[date]添加到ID索引中,則將對性能有很大幫助,它將沒有表掃描,僅聚簇索引查找。


DECLARE @ID BIGINT
SELECT @ID = MIN(ID) FROM A
WHILE @ID < IDENT_CURRENT('DBO.A')
BEGIN
    BEGIN TRAN
        UPDATE A
        SET A.DATE = B.DATE
        FROM A
        INNER JOIN B (nolock)
        ON A.ID = B.ID
        WHERE A.ID BETWEEN @ID AND @ID + 100000
        AND A.DATE IS NULL
    COMMIT TRAN
    SET @ID = @ID + 100000
END 

UPDATE  A
    SET A.DATE = ZZ.DATE
FROM    A
        INNER JOIN
        (SELECT  A.ID, B.DATE
         FROM   A WITH (NOLOCK)
                INNER JOIN
                B WITH (NOLOCK)
                ON A.ID = B.ID

         WHERE  A.DATE IS NULL AND A.ID BETWEEN @a and @a + 100000
) AS ZZ
ON ( ZZ.ID = A.ID )
SET @X = @X + 100000
WAITFOR DELAY '00:00:05'
END

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM