--构造表tb1测试数据
create table tb1(ID int identity(1,1),C1 varchar(10),C2 int)
declare @C1 varchar(10),@C2 int
set @C1=1
while(@C1<=100)
begin
set @C2=1
while(@C2<=20)
begin
Insert into tb1(C1,C2) values('A'+@C1,@C2)
set @C2+=1
end
set @C1+=1
end
--构造表tb2测试数据
create table tb2(ID int identity(1,1),C1 int,C2 int)
declare @C1 int,@C2 int
set @C1=0
while(@C1<=999)
begin
set @C2=1
while(@C2<=45)
begin
Insert into tb2(C1,C2) values(@C1,@C2)
set @C2+=1
end
set @C1+=1
end
set statistics time on
--查询Sql
select t1.C1,t2.C1,COUNT(*) from tb1 t1,tb2 t2 
where t1.C2=t2.C2
group by t1.C1,t2.C1
说明:
tb1,tb2是经过简化后的表,本段查询Sql实际用在循环中。我查询耗时800多毫秒,循环起来就很不乐观了。执行计划显示主要开销:哈希匹配(开销70%)、并行度(开销20%),我希望能将查询耗时减少到200毫秒以内。哈希匹配是什么鬼东西,可以不用它吗?这个问题困扰我很久了,一直没有明显的改善,哪位朋友能不吝赐教?谢谢!

解决方案 »

  1.   

    两个表格上面都加上PK,然后添加FK
      

  2.   

    where 的字段上要有索引,如果满足条件的数据占比很高,那么 GROUP BY的字段上也应该考虑加索引
      

  3.   

    CREATE INDEX ix_tb1_c2_c1 ON tb1(c2,c1)
    CREATE INDEX ix_tb2_c2_c1 ON tb2(c2,c1)
    加索引之后可以快一点,但快不了多少。
    应该是最终输出的结果集大导致效率不高, 毕竟你都没过滤;