提高SQL查询性能
Sql: 如何提高上述查询的性能。这需要44秒。想让它少于10秒吗提高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的每一部分作为单独的语句进行尝试,您就会发现哪一部分比较慢。如果您有子选择和函数,则很有可能服务器需要临时表来执行选择,如果您没有足够的内存(或大型数据集或配置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)