Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在组中行具有最大值的位置高效更新980K记录_Sql Server_Performance_Tsql_Sql Server 2016 - Fatal编程技术网

Sql server 在组中行具有最大值的位置高效更新980K记录

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? | +-----------+---------+--------+----------

我正在努力在合理的时间内更新数据库中的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个,所以我的方法肯定是不可行的

谢谢你的帮助


该版本是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的结果。非常感谢您,祝您愉快,先生。