我一直在努力加快以下查询的速度。
偶然地,我注意到,如果我按如下方式分开“组”,则速度会大大提高。
这与我的直觉相反。
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
感谢您的解释,以便将来我可以建立更好的查询。
答案 0 :(得分:0)
在这里(我在网上找到了详细的分步查询信息),
a)在查询窗口中,输入更新语句。
b)突出显示查询并在其上单击鼠标右键。
c)在数据库引擎优化咨询中选择“分析查询”
d)选择要在其上执行查询的相应数据库。
e)在窗口顶部,单击“调整选项”,然后选择索引和索引视图。
f)单击视图菜单下面的开始分析。
g)如果有任何改进建议,请单击操作菜单并选择脚本建议以供以后实施(或)应用建议以立即应用于产品。
注意:在尝试上述步骤之前,IT最好以全扫描方式更新表的统计信息。