在表作为队列的场景中,以某种方式配置和查询它是至关重要的允许多个客户端同时处理队列项。
当使用带有 UPDLOCK 和 ROWLOCK 的悲观行锁定时,只有一个工作线程可以获得锁并处理一个队列项。 排。要解决此问题并启用并发处理,请考虑以下方法:
使用 OUTPUT 子句实现队列
OUTPUT 子句提供了一种原子地检索和修改行的机制。以下是如何使用 OUTPUT 子句实现队列:
with CTE as ( SELECT TOP(1) COMMAND, PROCESSED FROM TABLE WITH (READPAST) WHERE PROCESSED = 0) UPDATE CTE SET PROCESSED = 1 OUTPUT INSERTED.*;
此查询自动执行以下步骤:
聚集索引优化
为了进一步优化性能,在 PROCESSED 列上创建聚集索引至关重要。这可确保数据按处理顺序存储。
CREATE CLUSTERED INDEX cdxTable on TABLE(PROCESSED, ID);
避免非标准查询
为了获得最佳吞吐量,必须避免使用上述出队操作以外的方法查询队列表。尝试查看或将表用于其他目的可能会导致死锁和性能下降。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3