这是我的完整脚本:
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并不是你的查询不会阻塞其他用户,而是会忽略其他用户已经设置的锁。这导致有时读取两次或更多相同的行,或避免读取某些行…当数据库查询将数据写入表/索引时,保证数据完整性是不可接受的!