请教:两个表关联查询的效能问题

xiangsu 2018-01-09 12:50:54

--构造表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毫秒以内。

哈希匹配是什么鬼东西,可以不用它吗?

这个问题困扰我很久了,一直没有明显的改善,哪位朋友能不吝赐教?谢谢!
...全文
573 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiangsu 2018-01-16
  • 打赏
  • 举报
回复
哈希匹配是什么鬼东西,可以不用它吗?
吉普赛的歌 版主 2018-01-09
  • 打赏
  • 举报
回复
CREATE INDEX ix_tb1_c2_c1 ON tb1(c2,c1)
CREATE INDEX ix_tb2_c2_c1 ON tb2(c2,c1)
加索引之后可以快一点,但快不了多少。 应该是最终输出的结果集大导致效率不高, 毕竟你都没过滤;
xiangsu 2018-01-09
  • 打赏
  • 举报
回复
实际表中建了索引
zjcxc 元老 2018-01-09
  • 打赏
  • 举报
回复
这个明显没索引啊
zjcxc 元老 2018-01-09
  • 打赏
  • 举报
回复
where 的字段上要有索引,如果满足条件的数据占比很高,那么 GROUP BY的字段上也应该考虑加索引
shoppo0505 2018-01-09
  • 打赏
  • 举报
回复
两个表格上面都加上PK,然后添加FK

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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