gpt4 book ai didi

sql - 使用唯一数据更新 SQL Server 中的 500,000 行

转载 作者:行者123 更新时间:2023-12-04 06:08:59 25 4
gpt4 key购买 nike

所以我正在研究一些数据库“去标识化”,其中基本上每条信息都会发生变化。在大多数较小的表上,一个简单的 while 更新并不太耗时(直到有 10,000 行左右的表。我现在已经转移到一个大约有 500,000 行的表。

我已经读过进行这种“更新”的最快方法实际上只是选择一个临时表来更新您需要的列。 (我在这里阅读。Fastest way to update 120 Million records)

问题在于 OP 正在使用单个值更新所有相似的值,因为我的每个值都不同,即将单列中的空行更新为 -1,我正在更新新行中的每一列或多或少是一个随机日期;这是我到目前为止所得到的。

--The only Index on Treatments is a Clustered Primary Key (TreatmentID)
SELECT * INTO #Treatments_temp
FROM Treatments
CREATE CLUSTERED INDEX IDX_Treatments ON #Treatments_temp(TreatmentID)

SET @rows = (SELECT TOP 1 TreatmentID
FROM Treatments
ORDER BY TreatmentID Desc)

WHILE (@rows > 0)
BEGIN

--There are only 500,000 records in this table from count(*) but the PK is much
--higher (some records are deleted, made in error ETC so this if statement is my
--attempt to bypass the code for @rows that don't actually exist.

IF (SELECT TreatmentID FROM #Treatments_temp WHERE TreatmentID = @rows) IS NOT NULL
BEGIN
DECLARE @year INT;
DECLARE @month INT;
DECLARE @date INT;
DECLARE @newStartDate SMALLDATETIME;
DECLARE @multiplier FLOAT;

SET @multiplier = (SELECT RAND());

SET @year = @multiplier * 99 + 1900;
SET @month = @multiplier * 11 + 1;
SET @date = @multiplier * 27 + 1;

SET @newStartDate = DATEADD(MONTH,((@year-1900)*12)+@month-1,@date-1);

UPDATE #Treatments_temp
SET StartDate = @newStartDate
WHERE TreatmentID = @rows

UPDATE #Treatments_temp
SET EndDate = DATEADD(MINUTE, @timebetween, @newStartDate)
WHERE TreatmentID = @rows
END

SET @rows = @rows - 1
END

最佳答案

在不了解您拥有的更多信息的情况下,我认为最简单的方法是:

  • 将您的“随机化”逻辑放入标量函数
  • 仅用您的 ID 制作一张窄 table 以及每个 ID 的函数结果
  • 更新您的 TreatmentINNER JOIN 的 table 在窄表上获取新值

  • 不需要逐行方法来解决这个问题。

    关于sql - 使用唯一数据更新 SQL Server 中的 500,000 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8009017/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com