sql - 我可以优化这个 SQL 远程更新吗?

标签 sql sql-server tsql sql-server-2000

我有这个更新远程表的 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/

相关文章:

tsql - 如何递归读取所有记录并按级别深度显示 TSQL

tsql - 乘法和除法的顺序优先

mysql 获取每个客户在打开购物车的日期范围内订购的所有产品的列表

mysql - 如何在 MySQL 中返回数据透视表输出?

sql - ORA-06532 : Subscript outside of limit

sql - 使用同一列中最新的空值更新空值

sql-server - 在 T-SQL 中将重复空格替换为单个空格

sql-server - Visual Studio Team System 数据库版 (GDR) 的真正优势是什么?

mysql - 针对其他表过滤具有多个内部联接的一个表

tsql - 删除表中的所有外键