簡體   English   中英

將值設置為表中超過500萬行的新datetime列

[英]Set value to a new datetime column in a table with over 5 million rows

我有一個名為Example的表,該表有500萬以上的行。 我想知道最有效的方法來創建一個新的DateTime列,該列不允許為空並且默認值為Now。 僅設置該值將由於行數而失敗。

我想到的計划將涉及:

1)創建一個允許空值的新列。

ALTER TABLE Example
ADD RecordDate datetime
GO

2)將該列的值一次設置為GETDATE() 1000(或更多,如果可能)行。

3)一旦所有行都有值,我將更改該列以不允許為空。

ALTER TABLE Example
ALTER COLUMN RecordDate datetime NOT NULL

我不確定完成第2步的最有效方法是什么,因此我希望了解一些技巧。

要通過具有順序ID的大型表工作,並批量應用更新,此方法將有效:

DECLARE @startID bigint
DECLARE @endID bigint

SELECT @startID=min(ID) from Example

WHILE @startID IS NOT NULL BEGIN
  SELECT @endID=MAX(ID) FROM (
    SELECT top(1000) ID from Example where ID>=@startID ORDER BY ID
  ) t

  update Example
  set RecordDate = GETDATE()
  where ID between @startID and @endID AND RecordDate IS NULL

  IF @@ROWCOUNT=0 BEGIN
    SET @startID=NULL
  END ELSE BEGIN
    SET @startID=@endID
  END
END

批次大小由

SELECT top(1000) ID from Example where ID>=@startID ORDER BY ID

根據需要調整1000,以確保每個UPDATE快速完成。 我已使用此技術以大約每次更新100000的批量更新數億行。

我會建議:

ALTER TABLE Example ADD COLUMN RecordDate datetime NOT NULL DEFAULT getdate();

無論您如何嘗試,都將不得不重寫所有數據記錄,以在每個頁面上為該值添加額外的字節-即使該值為NULL。

我認為以下方法可以最大程度地減少對數據的更改:

ALTER TABLE Example ADD _RecordDate datetime;

ALTER TABLE Example ADD FirstDateTime as (cast(<current datetime> as datetime));

ALTER TABLE Example ADD RecordDate as COALESCE(_RecordDate, FirstDateTime);

再次考慮,您仍然必須在頁面上為_RecordDate保留空間,因此第一種方法可能是最好的。

另一種選擇是用相同的主鍵和記錄日期設置另一個表。 這需要left join來獲取信息,但這僅在您訪問列時才需要。

米蘭

您可以在步驟1上嘗試使用此腳本:

ALTER TABLE Example ADD RecordDate DATETIME NOT NULL DEFAULT GETDATE()    

現在,您不需要步驟2和#3。

暫無
暫無

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

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