小编Rob*_*ini的帖子

在并发调用中使用 CTE 和 OUTPUT 块进行更新

我遇到了死锁问题,所以我开始使用我在某处读到的这个 CTE 技巧。没有更多的僵局。

但是现在我添加的每个客户端都会减慢(阻止?)存储过程。例如,1 个客户端的 1-2 秒更新变为两个客户端的 2-4 秒。(这个简单的隐喻查询运行时间为 0.001 秒,但在少数客户之后达到 0.03 秒——所以这个问题与我的实际实现无关。)

是锁定问题吗?我需要将它包装在(某种)交易中吗?

WITH UpdateView AS (
    SELECT TOP 1 W.*
    FROM [WidgetSandbox].[dbo].[Widgets] W
    INNER JOIN [WidgetSandbox].[dbo].[Sizes] S ON W.SizeId = S.Id
    WHERE W.StatusId = @availableStatusId
    AND W.ColorCode = @colorCode
    ORDER BY S.DiameterInches
)

UPDATE UpdateView 
SET StatusId = @soldOutStatusId
OUTPUT INSERTED.Id INTO @outputIds;

SET @singleUpdatedId = (SELECT TOP 1 Id FROM @outputIds);

SELECT * FROM [WidgetSandbox].[dbo].[Widgets]
WHERE Id = @singleUpdatedId;
Run Code Online (Sandbox Code Playgroud)

我希望我能更好地了解具体问题是什么,但事实上我只是被卡住了......

DDL,如果有帮助:https : //gist.github.com/RobertBaldini/3740c7bb85eea47d7fe63cb8602ac2d6

回购:https : …

sql-server deadlock stored-procedures concurrency locking

5
推荐指数
1
解决办法
2576
查看次数

大表连接的 OrderBy int 慢

我有大约 150 万条记录。此查询适用于较小的数据,但每几十万条记录就会慢一秒。对于 150 万,查询明显困难。

我模拟了一个全新的 Code First 项目来验证问题与我的实现无关,并提供以下示例查询:

    SELECT TOP 1 Widgets.*
    FROM [WidgetSandbox].[dbo].[Widgets] Widgets
    INNER JOIN [WidgetSandbox].[dbo].[Status] Statuses ON Widgets.StatusId = Statuses.Id
    INNER JOIN [WidgetSandbox].[dbo].[Colors] Colors ON Widgets.ColorCode = Colors.ColorCode
    INNER JOIN [WidgetSandbox].[dbo].[Sizes] Sizes ON Widgets.SizeId = Sizes.Id
    WHERE Statuses.Name = 'Available'
    AND Colors.Name = 'Red'
    ORDER BY Sizes.DiameterInches
Run Code Online (Sandbox Code Playgroud)

DiameterInches 是一个int, 作为我实际代码中“PriorityLevel”的隐喻。

如果我注释掉ORDER BY Sizes.DiameterInches,它会立即返回,但如果我想找到“最小的可用红色小部件”,它就会爬行。

有没有更好的办法?

在此处输入图片说明

执行计划 XML:https : //gist.github.com/RobertBaldini/57c8b61d135cc5c84c38b2da243611ad

DDL:https : //gist.github.com/RobertBaldini/3740c7bb85eea47d7fe63cb8602ac2d6

回购(数据加载器需要几分钟):https : //github.com/RobertBaldini/WidgetSandbox

performance sql-server execution-plan query-performance

1
推荐指数
1
解决办法
565
查看次数