提高SQL查询性能

提高SQL查询性能,sql,sql-server,performance,query-tuning,Sql,Sql Server,Performance,Query Tuning,Sql: 如何提高上述查询的性能。这需要44秒。想让它少于10秒吗 谢谢,分而治之:只需将sql的每一部分作为单独的语句进行尝试,您就会发现哪一部分比较慢。如果您有子选择和函数,则很有可能服务器需要临时表来执行选择,如果您没有足够的内存(或大型数据集或配置sql server来执行选择),则此临时对象会被交换到磁盘,这也会使速度变慢 您有关于接收日期和状态的索引吗?(不是每个索引的索引,组合) 此外: 您在表中有4次触摸,这意味着查询将至少缩放到O(4n)。 通过使用COUNT(CASE),您

Sql:

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


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

您有关于
接收日期和
状态的索引吗?(不是每个索引的索引,组合)

此外:

  • 您在表中有4次触摸,这意味着查询将至少缩放到O(4n)。 通过使用COUNT(CASE),您可以删除
    已传递的
    未传递的
    子查询
  • 简单计数子查询也不需要
  • 你需要分组。你的独特是一个工作的周围

  • =
    之间的子查询太多了,伙计!摆脱其中一些,这会有所帮助。此外,您不应该在sqls的两侧都使用函数

    例如:

    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)
    
    在这种特定情况下,db引擎必须遍历所有行,以计算
    DateDiff(Day,0,A.Receive_date)和DateAdd(Day,DateDiff(Day,0,A.Receive_date),0)
    ,然后将其与右侧进行比较,右侧也是一个函数!这简直是一场灾难


    另外,您是否有关于
    接收日期的索引?如果没有,请添加。

    请编辑您的问题。请描述您的模式。您使用的是哪个数据库?mysql?sqlsever?一个问题:为什么使用子查询而不是查询表?@niktrs:为了更清楚一些
    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)
    
    where DateAdd(Day, DateDiff(Day, 0, A.Receive_date), 0)=
                  DateAdd(Day, DateDiff(Day, 0, m.Receive_date), 0)