[英]Set results to be array in a new column for over a million rows -postgreSQL
[英]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.