我看了一下建立的索引,是以站号和时间双索引,而且站号在前时间在后,我的查询是一条语句全查,语句是这样的: "select a.站名, a.区站号, a.经度, a.纬度, b.total from (select 站名, 区站号, 经度, 纬度 from statparazhou where 区站号 like 'H____') a INNER JOIN (SELECT 区站号, SUM(CONVERT(bigint, 一小时雨量)) AS total , count(*) as tj FROM tabTimeData WHERE 日期时间 between '20080120 06:00:00' AND '20080121 05:00:00' AND 一小时雨量 IS NOT NULL GROUP BY 区站号) b ON a.区站号 = b.区站号 where b.tj=24" 我也看了一下别人做的存储过程,他是一个站一个站进行合计的,用了一个循环来实现的.我想是不是这样的,因为他是以站号和时间的双聚合索引,站号在前,因此他的查询语句的执行效率高,而我的就慢,如果以时间在前站号在后我的效率就高了呢? 请zjcxc 和大家帮我分析一下.
select * into statparazhou2 from statparazhou select * into tabTimeData2 from tabTimeData add index ix_stat2_qzh on statparazhou2(区站号) add index ix_timdata2_qzh on tabTimeData2(区站号) add index ix_timdata2_rq on tabTimeData2(日期时间)select a.站名,a.区站号,a.经度,a.纬度,b.total from statparazhou2 a inner join (SELECT 区站号, SUM(CONVERT(int, 一小时雨量)) AS total, count(*) as tj FROM tabTimeData2 WHERE 日期时间 between '20080120 06:00:00' AND '20080121 05:00:00' AND 一小时雨量 IS NOT NULL having count(*)=24 GROUP BY 区站号) b ON a.区站号=b.区站号 where a.区站号 like 'H____'
"select a.站名, a.区站号, a.经度, a.纬度, b.total from (select 站名, 区站号, 经度, 纬度 from statparazhou where 区站号 like 'H____') a INNER JOIN (SELECT 区站号, SUM(CONVERT(bigint, 一小时雨量)) AS total , count(*) as tj FROM tabTimeData WHERE 日期时间 between '20080120 06:00:00' AND '20080121 05:00:00' AND 一小时雨量 IS NOT NULL GROUP BY 区站号) b ON a.区站号 = b.区站号 where b.tj=24" ---------------------------------------------------- 1)蓝色部分在小表上,问题估计不大。 2)对于红色部分,你可以考虑在“日期时间”上建聚合索引。 因为你的那个有500万记录的表是按时间递增的,且不会修改时间,而且使用BETWEEN做查询, 所以在这个字段上建聚合索引会比较有效。 对于聚合索引,最好不要使用多个字段,一个字段是最有效的。 如果你要使用多个字段,那么用INCLUDE把多的字段包含进去,但你的情况没有这个必要。 3)然后在“区站号”上另外建一个普通索引就可以。老大在1楼和2楼建议的方法是很经典的,不管怎么改索引,还要看查询计划是什么样的。
"select a.站名, a.区站号, a.经度, a.纬度, b.total from (select 站名, 区站号, 经度, 纬度 from statparazhou where 区站号 like 'H____') a INNER JOIN (SELECT 区站号, SUM(CONVERT(bigint, 一小时雨量)) AS total , count(*) as tj FROM tabTimeData WHERE 日期时间 between '20080120 06:00:00' AND '20080121 05:00:00' AND 一小时雨量 IS NOT NULL GROUP BY 区站号) b ON a.区站号 = b.区站号 where b.tj=24"
我也看了一下别人做的存储过程,他是一个站一个站进行合计的,用了一个循环来实现的.我想是不是这样的,因为他是以站号和时间的双聚合索引,站号在前,因此他的查询语句的执行效率高,而我的就慢,如果以时间在前站号在后我的效率就高了呢?
请zjcxc 和大家帮我分析一下.
select * into tabTimeData2 from tabTimeData
add index ix_stat2_qzh on statparazhou2(区站号)
add index ix_timdata2_qzh on tabTimeData2(区站号)
add index ix_timdata2_rq on tabTimeData2(日期时间)select a.站名,a.区站号,a.经度,a.纬度,b.total from statparazhou2 a
inner join
(SELECT 区站号, SUM(CONVERT(int, 一小时雨量)) AS total, count(*) as tj
FROM tabTimeData2
WHERE 日期时间 between '20080120 06:00:00' AND '20080121 05:00:00' AND 一小时雨量 IS NOT NULL
having count(*)=24
GROUP BY 区站号) b
ON a.区站号=b.区站号
where a.区站号 like 'H____'
----------------------------------------------------
1)蓝色部分在小表上,问题估计不大。
2)对于红色部分,你可以考虑在“日期时间”上建聚合索引。
因为你的那个有500万记录的表是按时间递增的,且不会修改时间,而且使用BETWEEN做查询,
所以在这个字段上建聚合索引会比较有效。
对于聚合索引,最好不要使用多个字段,一个字段是最有效的。
如果你要使用多个字段,那么用INCLUDE把多的字段包含进去,但你的情况没有这个必要。
3)然后在“区站号”上另外建一个普通索引就可以。老大在1楼和2楼建议的方法是很经典的,不管怎么改索引,还要看查询计划是什么样的。