数据库是sql2008,库中有两个表,Table1和Table2
表Table1中有800万数据,我对Table1创建了分区表,按时间字段分区,需要查询的字段都建立了非聚集索引,查询表Table1速度很快。表Table2中有15万数据,由于数据量不大所有没有创建分区表,只是对需要查询的字段建立了非聚集索引,查询表Table2速度也很快。现在我需要同时查询表Table1所有字段和表Table2中的几个字段,于是我建立了视图,也是用时间字段连接,语句如下:
SELECT a.*,(SELECT TOP 1 Table2Field FROM Table2 WHERE Time=a.Time) AS Table2Field FROM Table1 a
可查询速度比较慢,请问有何方法能提高查询效率?谢谢!
表Table1中有800万数据,我对Table1创建了分区表,按时间字段分区,需要查询的字段都建立了非聚集索引,查询表Table1速度很快。表Table2中有15万数据,由于数据量不大所有没有创建分区表,只是对需要查询的字段建立了非聚集索引,查询表Table2速度也很快。现在我需要同时查询表Table1所有字段和表Table2中的几个字段,于是我建立了视图,也是用时间字段连接,语句如下:
SELECT a.*,(SELECT TOP 1 Table2Field FROM Table2 WHERE Time=a.Time) AS Table2Field FROM Table1 a
可查询速度比较慢,请问有何方法能提高查询效率?谢谢!
from Table1 a , Table2 b
where a.time = b.time and b.Table2Field = (select top 1 Table2Field from table2 where time = b.time)
嵌套循环(Left Outer Join)开销1%
索引扫描(NonClustered) 开销3%
聚集索引查找(clustered) 开销95%其余开销均为0%
刚才这样查询我测试了下,速度依然比较慢,我试过很多种写法,感觉单纯优化SQL语句没什么作用。
之前Table2表Time是非聚集的,我改成了聚集的,后者比前者就快1秒钟,但是查询仍然比较慢。
Table1表的Time是非聚集的,但Table1的Time有分区。
Time改成非聚集 执行计划为嵌套循环(Left Outer Join)开销1%
排序(Sort)开销30%
索引扫描(NonClustered) 开销3%
并行序(Repartition Streams)开销1%
表假脱机(Lazy Spool)开销65%其余开销均为0%
SELECT distinct a.*,b.Table2Field FROM Table1 a inner jion Table2 on a.Time=b.time
要从相同的TIME中找第一个table2field,而且还要关联表,快得起来才怪了.
1.
select
a.* , b.Table2Field
from
Table1 a , Table2 b
where
a.time = b.time
and
b.Table2Field = (select max(Table2Field) from table2 where time = b.time)2.---不用distinct 用group bySELECT
a.*,b.Table2Field
FROM
Table1 a inner join Table2 on a.Time=b.time
group by
.....
两种方法TIME字段都加上索引
time上建了索引,一直都有的。
FROM Table1 a outer apply
(SELECT TOP 1 Table2Field FROM Table2 WHERE Time=a.Time) b