我有这个更新远程表的 sql 更新语句。有什么方法可以优化/加速此代码?它作为存储过程的一部分运行。
DECLARE @WIP Table(Item varchar(25), WIP int)
--Get Work In Progress Numbers
INSERT INTO @WIP
select (UPC.ItemPrefix + '-' + UPC.ItemCode) As Item, SUM(PO.Quantity) As WIP
--into #WIP
from [NCLGS].[dbo].[AL_ItemUPCs] UPC
INNER JOIN al_PO PO ON PO.UPCID = UPC.UPCID
where PO.status in ('Assigned', 'New', 'UnAssigned', 'WaitingForFile')
Group by (UPC.ItemPrefix + '-' + UPC.ItemCode)
--SLOW PART, takes over 17 minutes
UPDATE [Server].[Database].[dbo].[Item]
SET QtyOnHand = IH.QtyOnHand,
QtyWorkInProgress = W.WIP
FROM Avanti_InventoryHeader IH
INNER JOIN [Server].[Database].[dbo].[Item] I ON I.ItemNumber = IH.ItemNumber
LEFT JOIN @WIP W ON IH.ItemNumber = W.Item
WHERE isnumeric(left(IH.ItemNumber, 2)) = 0
最佳答案
我过去遇到过类似的问题,我不得不使用动态 SQL 来提高性能。
我发现当我将本地临时表与远程表连接起来时,SQL 会将所有数据带到本地服务器,然后过滤我在 where 语句中拥有的内容。
在这种情况下,我会尝试在动态查询中使用 SELECT UNION ALL 将整个变量表 @WIP 作为嵌套表传递。
我正在谈论这样的事情:
DECLARE @WIP Table(Item varchar(25), WIP int)
--Get Work In Progress Numbers
INSERT INTO @WIP
select (UPC.ItemPrefix + '-' + UPC.ItemCode) As Item, SUM(PO.Quantity) As WIP
--into #WIP
from [NCLGS].[dbo].[AL_ItemUPCs] UPC
INNER JOIN al_PO PO ON PO.UPCID = UPC.UPCID
where PO.status in ('Assigned', 'New', 'UnAssigned', 'WaitingForFile')
Group by (UPC.ItemPrefix + '-' + UPC.ItemCode)
declare @SQL VARCHAR(MAX)
set @SQL = '
UPDATE [Server].[Database].[dbo].[Item]
SET QtyOnHand = IH.QtyOnHand,
QtyWorkInProgress = W.WIP
FROM Avanti_InventoryHeader IH
INNER JOIN [Server].[Database].[dbo].[Item] I
ON I.ItemNumber = IH.ItemNumber
LEFT JOIN ('
select @SQL = @SQL + 'select '''+w.Item+''' as Item,
'''+cast( w.WIP as varchar(50))+''' as WIP union all '
from @WIP W
set @SQL = @SQL + ' select NULL,0 ) W
ON IH.ItemNumber = W.Item
WHERE isnumeric(left(IH.ItemNumber, 2)) = 0 '
PRINT @SQL
它看起来不是很整洁,但它可能对你有用,就像对我一样。
关于sql - 我可以优化这个 SQL 远程更新吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6667414/