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

哈了 2015-04-03 03:57:35
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,并且城北的的数据量比城南的多,高手指点下怎么办?
...全文
248 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-04-10
  • 打赏
  • 举报
回复
让查询、连接的条件都能用到索引啊。
SQL的执行速度主要靠索引,索引查找是直径内存操作,当然比读取硬盘再处理快多了。
哈了 2015-04-09
  • 打赏
  • 举报
回复
引用 6 楼 Tiger_Zhao 的回复:
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,使用标志)
多谢指无教,速度快多了,都一样了,能问下这是为什么?
Ny-6000 2015-04-07
  • 打赏
  • 举报
回复
1)area_tb 全表扫描就扫吧 2)device_tb 建索引(小区ID,设备ID) 3)先把 deviceports_tb.使用标志 NULL 更新为空字符串 '' 4)再把 deviceports_tb.使用标志 设计为 NOT NULL DEFAULT('') 5)deviceports 建索引(设备ID,使用标志)
Tiger_Zhao 2015-04-07
  • 打赏
  • 举报
回复
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,使用标志)

哈了 2015-04-03
  • 打赏
  • 举报
回复
引用 4 楼 Tiger_Zhao 的回复:
统计结果“城北的的数据量比城南的多”并不代表扫描的记录也多。 看下面三组统计。
    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.使用标志
城北 190 城南 182 城南 2268 城北 2065 城北 用户到期 809 城南 用户到期 167 城南 空闲 41 城南 帐号无效 145 城北 VLAN匹配错误 1234 城北 帐号无效 2 城南 VLAN匹配错误 103 城南 有效 2731 城南 NULL 17136 城北 有效 5923 城北 NULL 13698
Tiger_Zhao 2015-04-03
  • 打赏
  • 举报
回复
统计结果“城北的的数据量比城南的多”并不代表扫描的记录也多。
看下面三组统计。
    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.使用标志
哈了 2015-04-03
  • 打赏
  • 举报
回复
引用 2 楼 OrchidCat 的回复:
  
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


引用 1 楼 sz_haitao 的回复:
以不同的条件 单独执行子查询,时间分别是多少?
mssql的优化有时候是有点反常的


引用 2 楼 OrchidCat 的回复:
  
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

城北:
城南:
Mr_Nice 2015-04-03
  • 打赏
  • 举报
回复
  
  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
haitao 2015-04-03
  • 打赏
  • 举报
回复
以不同的条件 单独执行子查询,时间分别是多少? mssql的优化有时候是有点反常的

22,300

社区成员

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

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