为什么在此更新中分离集合会提高速度?

时间:2019-03-04 09:05:55

标签: sql-server

我一直在努力加快以下查询的速度。

偶然地,我注意到,如果我按如下方式分开“组”,则速度会大大提高。

这与我的直觉相反。

UPDATE [Arthur].[ZX].[Orders]  
    SET [Status] = IIF ((SELECT SUM([ExecSignedAmount]) 
                            FROM [Arthur].[ZX].[FilledOrders] 
                            WHERE [Symbol] = [Arthur].[ZX].[Orders].[Symbol] AND [AccountIdent] = [Arthur].[ZX].[Orders].[AccountIdent]) = [Arthur].[ZX].[Orders].[TargetPosition], 'Filled' , 'Working'), 
                        [ExecDate] = '2019-03-02', [ExecUTC] = '12:44:45.8764130', 
                        [ExecSignedAmount] = (SELECT sum([ExecSignedAmount]) FROM [Arthur].[ZX].[FilledOrders] WHERE [OrderID] = 100151), 
                        [ExecPrice] = (SELECT sum([ExecSignedAmount] * [ExecPrice])/ISNULL(NULLIF(sum([ExecSignedAmount]),0),1) 
                                        FROM [Arthur].[ZX].[FilledOrders] WHERE [OrderID] = 100151), 
                        [ExecSettDate] = '2019-03-02', 
                        [DogProvider] = 'DUM' 
                        WHERE [OrderID] = 100151

但是,如果我分别使用IIF单独进行这两个操作,则速度会提高10倍!

UPDATE [Arthur].[ZX].[Orders]  
SET [ExecDate] = '2019-03-02', [ExecUTC] = '12:44:45.8764130', 
                    [ExecSignedAmount] = (SELECT sum([ExecSignedAmount]) FROM [Arthur].[ZX].[FilledOrders] WHERE [OrderID] = 100151), 
                    [ExecPrice] = (SELECT sum([ExecSignedAmount] * [ExecPrice])/ISNULL(NULLIF(sum([ExecSignedAmount]),0),1) 
                                    FROM [Arthur].[ZX].[FilledOrders] WHERE [OrderID] = 100151), 
                    [ExecSettDate] = '2019-03-02', 
                    [DogProvider] = 'DUM' 
                    WHERE [OrderID] = 100151;

UPDATE [Arthur].[ZX].[Orders]  
SET [Status] = IIF ((SELECT SUM([ExecSignedAmount]) 
                        FROM [Arthur].[ZX].[FilledOrders] 
                        WHERE [Symbol] = [Arthur].[ZX].[Orders].[Symbol] AND [AccountIdent] = [Arthur].[ZX].[Orders].[AccountIdent]) = [Arthur].[ZX].[Orders].[TargetPosition], 'Filled' , 'Working')                   
                    WHERE [OrderID] = 100151

感谢您的解释,以便将来我可以建立更好的查询。

1 个答案:

答案 0 :(得分:0)

在这里(我在网上找到了详细的分步查询信息),

a)在查询窗口中,输入更新语句。

b)突出显示查询并在其上单击鼠标右键。

c)在数据库引擎优化咨询中选择“分析查询”

d)选择要在其上执行查询的相应数据库。

e)在窗口顶部,单击“调整选项”,然后选择索引和索引视图。

f)单击视图菜单下面的开始分析。

g)如果有任何改进建议,请单击操作菜单并选择脚本建议以供以后实施(或)应用建议以立即应用于产品。

注意:在尝试上述步骤之前,IT最好以全扫描方式更新表的统计信息。

Source

Another helpful link regarding optimizing update query