Sql server 在组中行具有最大值的位置高效更新980K记录
我正在努力在合理的时间内更新数据库中的980000条记录 我必须在PriceID等于组的最大值(按ProductID分组)的行中将NextLp的值设置为“NULL” 为了形象化,以下是我的示例: +-----------+---------+--------+---------------------+ | ProductID | PriceID | NextLp | Set NextLp to NULL? | +-----------+---------+--------+---------------------+ | APPLE | 1 | - | | +-----------+---------+--------+---------------------+ | APPLE | 2 | - | | +-----------+---------+--------+---------------------+ | APPLE | 3 | - | Yes | +-----------+---------+--------+---------------------+ | PEAR | 1 | - | | +-----------+---------+--------+---------------------+ | PEAR | 2 | - | Yes | +-----------+---------+--------+---------------------+ +-----------+---------+--------+---------------------+ |ProductID | PriceID | NextLp |是否将NextLp设置为空| +-----------+---------+--------+---------------------+ |苹果| 1 |-|| +-----------+---------+--------+---------------------+ |苹果| 2 |-|| +-----------+---------+--------+---------------------+ |苹果| 3 |-|是的| +-----------+---------+--------+---------------------+ |梨| 1 |-|| +-----------+---------+--------+---------------------+ |梨| 2 |-|是的| +-----------+---------+--------+---------------------+ 我尝试过各种方法,但所有这些方法都花了至少15秒来更新100条记录。。还有979100个,所以我的方法肯定是不可行的 谢谢你的帮助Sql server 在组中行具有最大值的位置高效更新980K记录,sql-server,performance,tsql,sql-server-2016,Sql Server,Performance,Tsql,Sql Server 2016,我正在努力在合理的时间内更新数据库中的980000条记录 我必须在PriceID等于组的最大值(按ProductID分组)的行中将NextLp的值设置为“NULL” 为了形象化,以下是我的示例: +-----------+---------+--------+---------------------+ | ProductID | PriceID | NextLp | Set NextLp to NULL? | +-----------+---------+--------+----------
该版本是MS SQL 2016可能与此相关
DECLARE @tbl TABLE(ProductID VARCHAR(100),PriceID INT,NextLp VARCHAR(100));
INSERT INTO @tbl VALUES
('APPLE',1,'-')
,('APPLE',2,'-')
,('APPLE',3,'-')
,('PEAR ',1,'-')
,('PEAR ',2,'-');
WITH UpdatableCTE AS
(
SELECT *
,ROW_NUMBER() OVER(PARTITION BY ProductID ORDER BY PriceID DESC) AS Nr
FROM @tbl
)
UPDATE UpdatableCTE SET NextLp=NULL
WHERE Nr=1;
SELECT * FROM @tbl;
您可以先使用可更新的CTE将数字放入行中,然后更新目标行
使现代化
结果
ProductID PriceID NextLp
APPLE 1 -
APPLE 2 -
APPLE 3 NULL
PEAR 1 -
PEAR 2 NULL
在我上面的示例中,两行被设置为NULL
。两行都是其组中最高的PriceID
行编号()
为。允许分区依据
在集合中创建组,而排序依据
将对组进行排序,在本例中,按价格ID
降序排列。这将为每一行绑定一个1
,其中PriceID
是ProductID
组中的最高值
提示:您可以使用
SELECT*FROM updateablecte
而不是UPDATE
语句。这将显示已编号的行,并允许检查编号。是否有触发器?在同一个表上是否有并发查询?您的数据库是否处于完全恢复模式?您在查询的列上有索引吗?请添加尽可能多的信息,包括实际的update语句。@EzLo无法回答这个问题。服务器相当远程,我只能通过控制台进行访问,我可以在控制台上运行查询。尽管如此,对相同数量记录的其他更新查询在50秒内运行。这似乎根本不会改变NextLp。将ORDER BY更改为ProductID并将PARTITION BY更改为PriceID会将所有NextLp设置为NULL。@JCode对不起,可能是我弄错了什么。。。请看我的updateMy bad,我没有想到执行SELECT TOP(100)可能不会在数据库中生成所有结果,从而隐藏了结果为NULL的结果。非常感谢您,祝您愉快,先生。