-1

数据:

select distinct DateAdd(Day, DateDiff(Day, 0, m.Receive_date), 0) as Date,
(select count(*) from Raw_Mats A where DateAdd(Day, DateDiff(Day, 0, A.Receive_date), 0)=DateAdd(Day, DateDiff(Day, 0, m.Receive_date), 0)) as Total,
(select count(*) from Raw_Mats B where DateAdd(Day, DateDiff(Day, 0, B.Receive_date), 0)=DateAdd(Day, DateDiff(Day, 0, m.Receive_date), 0) and B.status='Solved') as Delivered,
(select count(*) from Raw_Mats C where DateAdd(Day, DateDiff(Day, 0, C.Receive_date), 0)=DateAdd(Day, DateDiff(Day, 0, m.Receive_date), 0) and C.status='Pending') as UnDelivered
from Raw_Mats m where m.Receive_date between '2011-07-01' and '2011-07-21'

如何提高上述查询的性能。它需要 44 秒。想让它少于 10 秒

谢谢

4

3 回答 3

3

你对两者都有索引Receive_datestatus?(不是每个的索引,合并)

还:

  • 您在表中有 4 次触摸,这意味着查询将至少扩展 O(4n)。通过使用 COUNT(CASE) 您可以删除DeliveredUnDelivered子查询
  • 也不需要简单的计数子查询
  • 你需要 GROUP BY。YOUR DISTINCT 是解决这个问题的方法
  • BETWEEN 是>=并且<=对于有时间的日期通常不正确

为了清楚起见,我在这里使用了子查询,但这没关系:

select
   DateOnly as Date,
   COUNT(*) AS Total,
   COUNT(CASE WHEN status='Solved' THEN 1 END) AS Delivered,
   COUNT(CASE WHEN status='Pending' THEN 1 END) AS UnDelivered
from
   (
   SELECT
       DateAdd(Day, DateDiff(Day, 0, m.Receive_date), 0) as DateOnly,
       status
   FROM
      Raw_Mats
   WHERE
      Receive_date >= '2011-07-01' AND Receive_date < '2011-07-21'
   ) T
 GROUP BY
   DateOnly

编辑,没有子查询。

我从一个子查询开始,因为我认为它比预期的更复杂,并且没有费心把它拿出来......

select
   DateAdd(Day, DateDiff(Day, 0, m.Receive_date), 0) as Date,
   COUNT(*) AS Total,
   COUNT(CASE WHEN status='Solved' THEN 1 END) AS Delivered,
   COUNT(CASE WHEN status='Pending' THEN 1 END) AS UnDelivered
from
   Raw_Mats
WHERE
   Receive_date >= '2011-07-01' AND Receive_date < '2011-07-21'
GROUP BY
   DateAdd(Day, DateDiff(Day, 0, m.Receive_date), 0)
于 2011-07-20T07:33:00.107 回答
0

分而治之:只需将 sql 的每个部分作为单独的语句尝试,您就会发现哪个部分慢。如果您有子选择和功能,那么服务器很有可能需要临时表来执行选择,如果您没有足够的内存(或大型数据集或配置您的 sql 服务器这样做),这临时对象被交换到磁盘,这也使它变慢。

于 2011-07-20T07:32:26.983 回答
0

子查询太多了!摆脱其中的一些,它会有所帮助。此外,您不应该在 sql 的两边都使用函数。

例如:

where DateAdd(Day, DateDiff(Day, 0, A.Receive_date), 0)=
              DateAdd(Day, DateDiff(Day, 0, m.Receive_date), 0) 

在这种特定情况下,数据库引擎将必须遍历所有行来评估,DateDiff(Day, 0, A.Receive_date) and DateAdd(Day, DateDiff(Day, 0, A.Receive_date), 0)然后将其与右手边进行比较,这也是一个函数!这简直就是一场灾难。

另外,你有索引Receive_date吗?如果没有添加它。

于 2011-07-20T07:33:05.607 回答