当前位置: 代码迷 >> Sql Server >> ,同一个语句运行时间差好多
  详细解决方案

,同一个语句运行时间差好多

热度:10   发布时间:2016-04-24 09:13:47.0
求助,同一个语句运行时间差好多!
sql语句如下:
select tt.小区名称,tt.设备归属,COUNT(*) as 在用数 from (select deviceports_tb.*,device_tb.设备归属 ,area_tb .小区名称 from deviceports_tb ,area_tb ,device_tb where device_tb.设备ID =deviceports_tb.设备ID and device_tb.小区ID =area_tb.小区ID and area_tb.经营部='城南' and deviceports_tb.使用标志='有效' ) tt group by tt.小区名称,tt.设备归属 order by tt.小区名称,tt.设备归属
这句用时要15500ms,同样是上面这句把area_tb.经营部='城南'改成area_tb.经营部='城北'只要500ms,并且城北的的数据量比城南的多,高手指点下怎么办?
------解决思路----------------------
以不同的条件 单独执行子查询,时间分别是多少?
mssql的优化有时候是有点反常的
------解决思路----------------------
  
  SELECT    tt.小区名称 ,
            tt.设备归属 ,
            COUNT(*) AS 在用数
  FROM      ( SELECT    deviceports_tb.* ,
                        device_tb.设备归属 ,
                        area_tb.小区名称
              FROM      deviceports_tb ,
                        area_tb ,
                        device_tb
              WHERE     device_tb.设备ID = deviceports_tb.设备ID
                        AND device_tb.小区ID = area_tb.小区ID
                        AND area_tb.经营部 = '城南'          --换成城北立刻高速?
                        AND deviceports_tb.使用标志 = '有效'
            ) tt
  GROUP BY  tt.小区名称 ,
            tt.设备归属
  ORDER BY  tt.小区名称 ,
            tt.设备归属


看执行计划 Ctrl+L

------解决思路----------------------
统计结果“城北的的数据量比城南的多”并不代表扫描的记录也多。
看下面三组统计。
    SELECT area_tb.经营部, COUNT(*)
      FROM area_tb
     WHERE area_tb.经营部 = '城南'
        OR area_tb.经营部 = '城北'
  GROUP BY area_tb.经营部

    SELECT area_tb.经营部, COUNT(*)
      FROM area_tb
      JOIN device_tb
        ON device_tb.小区ID = area_tb.小区ID
     WHERE area_tb.经营部 = '城南'
        OR area_tb.经营部 = '城北'
  GROUP BY area_tb.经营部

    SELECT area_tb.经营部, deviceports_tb.使用标志, COUNT(*)
      FROM area_tb
      JOIN device_tb
        ON device_tb.小区ID = area_tb.小区ID
      JOIN deviceports_tb
        ON device_tb.设备ID = deviceports_tb.设备ID
     WHERE area_tb.经营部 = '城南'
        OR area_tb.经营部 = '城北'
  GROUP BY area_tb.经营部, deviceports_tb.使用标志

------解决思路----------------------
deviceports_tb 先不算别的地区:
城北 21666
城南 20323
其中居然 使用标志 IS NULL 的有 30834
你可以找个地洞转进去了

建出索引来试试吧
1)area_tb 全表扫描就扫吧
2)device_tb 建索引(小区ID,设备ID)
3)先把 deviceports_tb.使用标志 NULL 更新为空字符串 ''
4)再把 deviceports_tb.使用标志 设计为 NOT NULL DEFAULT('')
5)deviceports 建索引(设备ID,使用标志)


------解决思路----------------------
1)area_tb 全表扫描就扫吧
2)device_tb 建索引(小区ID,设备ID)
3)先把 deviceports_tb.使用标志 NULL 更新为空字符串 ''
4)再把 deviceports_tb.使用标志 设计为 NOT NULL DEFAULT('')
5)deviceports 建索引(设备ID,使用标志)
  相关解决方案