为什么这个查询阻塞了其他查询的运行?



这是我的完整脚本:

IF OBJECT_ID('tempdb..#Products_temp') IS NOT NULL 
BEGIN 
DROP TABLE #Products_temp
END
GO
SELECT p.product_id, p.price, p.cost, i.qty
INTO #Products_temp
FROM   Warehouse_Products p WITH (NOLOCK)
LEFT OUTER JOIN Warehouse_Inventory i WITH (NOLOCK)
ON p.product_id = i.product_id
GO
DELETE FROM cache.Products
GO
INSERT INTO cache.Products SELECT * FROM #Products_temp

由于某种原因,SELECT .. INTO部分在RUNNABLE状态下停留了3小时,而整个脚本通常需要6-7分钟才能完成。这阻塞了我所有的其他查询,这正是我首先编写这个脚本的原因。我想通过使用临时表来防止阻塞任何其他表/脚本,我在这里做错了什么?任何建议吗?

NOLOCK永远不会应用于insert, UPDATEs, DELETEs, merge和SELECT…在年代。

当使用加密/解密函数时,NOLOCK不会被应用…

想象一下什么是NOLOCK…NOLOCK并不是你的查询不会阻塞其他用户,而是会忽略其他用户已经设置的锁。这导致有时读取两次或更多相同的行,或避免读取某些行…当数据库查询将数据写入表/索引时,保证数据完整性是不可接受的!

最新更新