使用GROUP BY和IN的SQL查询太慢

尖锐的

我正在努力加快此SQL查询的速度。我尝试删除除两个SUM()函数和Id字段之外的所有字段,但是它仍然非常慢。目前需要15秒钟才能运行。是否有人提出任何建议来加快此速度,因为它当前导致我的Web应用程序中的页面超时。我需要显示的字段,所以我不能真正删除它们,但是肯定有一种方法可以改善这一点?

SELECT [Customer].[iCustomerID],
                [Customer].[sCustomerSageCode],
                [Customer].[sCustomerName],
                [Customer].[sCustomerTelNo1],
                SUM([InvoiceItem].[fQtyOrdered]) AS [Quantity],
                SUM([InvoiceItem].[fNetAmount]) AS [Value]
FROM            [dbo].[Customer]
LEFT JOIN       [dbo].[CustomerAccountStatus] ON ([Customer].[iAccountStatusID] = [CustomerAccountStatus].[iAccountStatusID])
LEFT JOIN       [dbo].[SalesOrder] ON ([SalesOrder].[iCustomerID] = [dbo].[Customer].[iCustomerID])
LEFT JOIN       [Invoice] ON ([Invoice].[iCustomerID] = [Customer].[iCustomerID])
LEFT JOIN   [dbo].[InvoiceItem] ON ([Invoice].[iInvoiceNumber] = [InvoiceItem].[iInvoiceNumber])
WHERE           ([InvoiceItem].[sNominalCode] IN ('4000', '4001', '4002', '4004', '4005', '4006', '4007', '4010', '4015', '4016', '700000', '701001', '701002', '701003'))
AND(            ([dbo].[SalesOrder].[dOrderDateTime] >= '2013-01-01')
OR              ([dbo].[Customer].[dDateCreated] >= '2014-01-01'))
GROUP BY [Customer].[iCustomerID],[Customer].[sCustomerSageCode],[Customer].[sCustomerName], [Customer].[sCustomerTelNo1];
戈登·利诺夫(Gordon Linoff)

无论如何,我认为此查询无法满足您的需求。如所写,Invoice表与SalesOrder之间没有任何关系这使我相信,它在发票和订单之间生产笛卡尔乘积,因此拥有大量订单的客户将生成大量不必要的中间行。

您可以通过SalesOrder从查询中删除来进行测试

SELECT c.[iCustomerID], c.[sCustomerSageCode], c.[sCustomerName], c.[sCustomerTelNo1],
       SUM(it.[fQtyOrdered]) AS [Quantity], SUM(it.[fNetAmount]) AS [Value]
FROM [dbo].[Customer] c LEFT JOIN
     [dbo].[CustomerAccountStatus] cas
     ON c.[iAccountStatusID] = cas.[iAccountStatusID] LEFT JOIN
     [Invoice] i
     ON (i.[iCustomerID] = c.[iCustomerID]) LEFT JOIN
     [dbo].[InvoiceItem] it
     ON (i.[iInvoiceNumber] = it.[iInvoiceNumber])
WHERE it.[sNominalCode] IN ('4000', '4001', '4002', '4004', '4005', '4006', '4007', '4010', '4015', '4016', '700000', '701001', '701002', '701003') AND
      c.[dDateCreated] >= '2014-01-01'
GROUP BY c.[iCustomerID], c.[sCustomerSageCode], c.[sCustomerName], c.[sCustomerTelNo1];

如果这可行并且您需要使用SalesOrder,那么您将需要按进行预聚合SalesOrder或找到更好的联接键。

上面的查询可以受益于上的索引Customer(dDateCreated, CustomerId)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

sql group_concat和子查询

来自分类Dev

使用嵌套子查询和GROUP BY的SQL查询

来自分类Dev

LINQ查询从SQL转换,SQL使用包含GROUP BY和COUNT的子查询

来自分类Dev

使用CASE和GROUP BY的SQL Server查询,字段无效?

来自分类Dev

使用SQL Server,GROUP BY

来自分类Dev

sql查询使用group by怎么办

来自分类Dev

使用GROUP BY和COUNT执行SQL UPDATE

来自分类Dev

使用GROUP BY的MySQL查询和使用ORDER BY的子查询

来自分类Dev

带GROUP BY和条件的SQL查询

来自分类Dev

使用sum和group by将sql查询转换为linq

来自分类Dev

SUM和GROUP BY使用子查询

来自分类Dev

在SQL中的子查询中使用group by

来自分类Dev

如何使用MySQL子查询和GROUP BY

来自分类Dev

在同一SQL查询中使用WHERE,HAVING和GROUP BY

来自分类Dev

使用UNION和GROUP BY的AS

来自分类Dev

SQL查询太慢

来自分类Dev

LINQ查询从SQL转换,SQL使用包含GROUP BY和COUNT的子查询

来自分类Dev

使用CASE和GROUP BY的SQL Server查询,字段无效?

来自分类Dev

使用OrientDB的ShortestPath查询太慢

来自分类Dev

sql查询使用group by怎么办

来自分类Dev

使用Group By和Let的LINQ查询

来自分类Dev

使用group by的oracle sql查询

来自分类Dev

查询太慢,没有使用索引

来自分类Dev

SUM和GROUP BY使用子查询

来自分类Dev

在SQL中的子查询中使用group by

来自分类Dev

使用SQL Server进行DISTINCT和GROUP BY

来自分类Dev

使用 group by 和 sum 的 SQL 联合

来自分类Dev

SQL 查询 group by 和 have all

来自分类Dev

使用 Group By 和 Being 的 SQL 查询