SQL server SQL 优化

weixin_36298198 2018-11-22 03:20:15
SELECT A.DayText, ISNULL(B.Num, 0) AS Num FROM View_DayText AS A LEFT OUTER JOIN
(SELECT MTime, COUNT(*) AS Num FROM (SELECT EquipmentID, DAY(MTime) AS MTime,
COUNT(EquipmentID) AS Expr1 FROM YY_MonitorData WHERE (MTime>= '2018-10-01 00:00:00' and MTime< '2018-11-01 00:00:00')
AND (State = '正常') AND (FJState = '正常') AND (JHQState = '正常') GROUP BY EquipmentID, DAY(MTime)) AS Z
GROUP BY MTime) AS B ON A.DayText = B.MTime WHERE A.DayText <=(SELECT DATEDIFF(DAY, '2018-10-22', DATEADD(MONTH, 1, '2018-10-22')))



统计的是每个月每天汇总数量。这个SQL 我只是展示10月份的就已经很慢了,
当前SQL 用时52秒很慢, 单表数据索引已建立,查询出来为几百万条。
用户需求需要展示从这个月开始往前推6个月的每个月每天的汇总数据,所以我想问下各位高手SQL 还怎么优化能更快点。


View_DayText 是一个视图只有一个字段,为1号到31号


...全文
184 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2018-11-22
  • 打赏
  • 举报
回复
SELECT DAY(MTime) AS MTime,
       COUNT(DISTINCT EquipmentID) AS Num
INTO #temp
FROM YY_MonitorData
WHERE (
          MTime >= '2018-10-01 00:00:00'
          AND MTime < '2018-11-01 00:00:00'
      )
      AND (State = '正常')
      AND (FJState = '正常')
      AND (JHQState = '正常')
GROUP BY DAY(MTime);

SELECT A.DayText,
       ISNULL(B.Num, 0) AS Num
FROM View_DayText AS A
    LEFT OUTER JOIN #temp AS B
        ON A.DayText = B.MTime
WHERE A.DayText <=
(
    SELECT DATEDIFF(DAY, '2018-10-22', DATEADD(MONTH, 1, '2018-10-22'))
)
DROP TABLE #temp
吉普赛的歌 2018-11-22
  • 打赏
  • 举报
回复
--1. 加计算列
ALTER TABLE YY_MonitorData ADD DayText AS DAY(MTime) PERSISTED
--2. 创建新索引
CREATE INDEX ix_YY_MonitorData_MTime_EquipmentID_DayText ON YY_MonitorData(MTime,EquipmentID,DayText)

--3. 执行修改后的语句
SELECT A.DayText,
       ISNULL(B.Num, 0)  AS Num
FROM   View_DayText      AS A
       LEFT OUTER JOIN (
                SELECT  DayText,   --主要替换此处
                        COUNT(EquipmentID) AS Num
                FROM   YY_MonitorData
                WHERE  (
                            MTime >= '2018-10-01 00:00:00'
                            AND MTime < '2018-11-01 00:00:00'
                        )
                        AND (STATE = '正常')
                        AND (FJState = '正常')
                        AND (JHQState = '正常')
                GROUP BY
                        EquipmentID
            )  AS B
            ON  A.DayText = B.MTime
WHERE  A.DayText <= (
           SELECT DATEDIFF(DAY, '2018-10-22', DATEADD(MONTH, 1, '2018-10-22'))
)
再看下需要多长时间?
weixin_36298198 2018-11-22
  • 打赏
  • 举报
回复
35秒还是不行,用户感觉还是太慢。
weixin_36298198 2018-11-22
  • 打赏
  • 举报
回复

引用 9 楼 yenange 的回复:
[quote=引用 8 楼 weixin_36298198 的回复:]
版主看一下。

我在 #5 中做好了
1. 去嵌套
2. 加索引 你有做吗?

你加上索引, 再运行一下看需要多长时间?[/quote]

上述表示已经都完成,索引很早都已经加了,数据库服务器用时35秒。
吉普赛的歌 2018-11-22
  • 打赏
  • 举报
回复
引用 8 楼 weixin_36298198 的回复:
版主看一下。
我在 #5 中做好了 1. 去嵌套 2. 加索引 你有做吗? 你加上索引, 再运行一下看需要多长时间?
weixin_36298198 2018-11-22
  • 打赏
  • 举报
回复
版主看一下。
weixin_36298198 2018-11-22
  • 打赏
  • 举报
回复
这个是当前 View_DayText 视图的所以数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
weixin_36298198 2018-11-22
  • 打赏
  • 举报
回复
引用 4 楼 sinat_28984567 的回复:
查询出来几百万?即使优化效果也不会太好,io成为瓶颈


我说的几百万的意思是查询出来这样的一个结果。1号 : 25000
2好 :30000
以此类推到31号
这个优化的话没办法优化了吗?当然数据库服务器的带宽很低。但客户要求所以我想问下怎么优化下这个SQL
吉普赛的歌 2018-11-22
  • 打赏
  • 举报
回复
--1. 去一层嵌套
--2. 创建索引
--   create index ix_YY_MonitorData_MTime on YY_MonitorData(MTime)
--3. 请贴出 View_DayText 的全部实际内容

SELECT A.DayText,
       ISNULL(B.Num, 0)  AS Num
FROM   View_DayText      AS A
       LEFT OUTER JOIN (
                SELECT  DAY(MTime) AS MTime,
                        COUNT(EquipmentID) AS Num
                FROM   YY_MonitorData
                WHERE  (
                            MTime >= '2018-10-01 00:00:00'
                            AND MTime < '2018-11-01 00:00:00'
                        )
                        AND (STATE = '正常')
                        AND (FJState = '正常')
                        AND (JHQState = '正常')
                GROUP BY
                        EquipmentID
            )  AS B
            ON  A.DayText = B.MTime
WHERE  A.DayText <= (
           SELECT DATEDIFF(DAY, '2018-10-22', DATEADD(MONTH, 1, '2018-10-22'))
       )
二月十六 2018-11-22
  • 打赏
  • 举报
回复
查询出来几百万?即使优化效果也不会太好,io成为瓶颈
weixin_36298198 2018-11-22
  • 打赏
  • 举报
回复
占个座位先了
weixin_36298198 2018-11-22
  • 打赏
  • 举报
回复
顶一下谢谢了
weixin_36298198 2018-11-22
  • 打赏
  • 举报
回复
各位高手帮帮忙!

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧