添加SUM语句会大大增加运行时间,是否有更好的方法?

时间:2020-10-07 22:23:50

标签: sql sum

我有一张有发票付款的表,可以是部分付款或全部付款。我正在将此计算字段与发票总额进行比较。我在查询中有两次,一次在Select语句中,再一次在Where子句中。即使我删除了一个,所以仅在“位置”或“选择”中,也要花一个多小时才能运行。如果我完全删除SUM,则需要10秒钟才能运行。

是否有更好的方法来求和?我应该使用索引视图吗?临时表?请注意,发票编号仅对供应商是唯一的,通常不唯一。最初的FROM是一个视图(如果有区别的话)。

select distinct
transdate,
invoicedate,
PAY.OrderAccount,
v.VendorName, 
invoiceamountmst,
(select sum(PAY1.settleamountcur) from [VIEW_INVOICE_PAYMENT] PAY1 where PAY.INVOICEID=PAY1.INVOICEID and PAY.OrderAccount=PAY1.OrderAccount) as "InvoiceSUM",
settleamountcur,
Currencycodeinvoice,
PAY.Description,
Voucher
from VIEW_INVOICE_PAYMENT PAY
inner join INVOICE on INVOICE_DOC_NO =invoiceid
JOIN VENDOR V on PAY.OrderAccount=v.VendorAccount
where TRANSDATE is not null
and (select sum(PAY1.settleamountcur) from [VIEW_INVOICE_PAYMENT] PAY1 where PAY.INVOICEID=PAY1.INVOICEID and PAY.OrderAccount=PAY1.OrderAccount)=total_cost_on_invoice

1 个答案:

答案 0 :(得分:0)

在这个答案中,当我指的是“那个选择”时,我指的是中间select sum(pay1.settlamountcur) ...的子查询

请注意,“ that select”中的别名看起来有些奇怪,例如select sum(PAY1.settleamountcur) from [VIEW_INVOICE_PAYMENT] AX1。 PAY1别名来自哪里?我可能错过了一些东西。如果这是您的代码中的错字,则可能是在做坏事(即使它可以运行)。假设不是,但是...

对于更广泛的问题,我相信它将为您的总体表返回的每一行运行一次select语句。确实,它可能会更频繁地执行此操作,具体取决于它何时在执行计划中进行过滤。

请注意,我在此答案中使用的是SQL Server-但它也应适用于其他数据库。

几个选项

  1. 与其引用该视图,不如将这些表带入当前查询并按此修改查询
  2. 尝试从子查询中删除聚合,而是对整个数据集进行聚合,例如,GROUP BY相关字段,对相关字段求和。可以与选项1结合使用。
  3. 将子查询放置为CTE或FROM组件内的子查询。这可能会使它用作单个表,而不是多次运行(或者可能不会运行)
  4. (有时是大型表的首选),例如,首先从视图中将相关数据获取到临时表中,
SELECT INVOICEId, OrderAccount, SUM(settleamountcur) AS total_settleamountcur
    INTO #Temp
    FROM [VIEW_INVOICE_PAYMENT] 
    GROUP BY INVOICEId, OrderAccount

-- Add any where/having clauses you can to filter
-- Consider creating temp table first with primary key, making joins easier for SQL Server

然后使用#Temp表代替该选择子查询。

相关问题