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,使用标志)