索引和表连接问题

zhangsong841 2010-05-15 08:59:47
两张表
A表结构
(CODE VARCHAR2(30),
.....
....)

B表结构
(CODE VARCHAR2(30),
......
.....),
有40万条记录,
在code 字段上有非聚集索引,且唯一。
没有聚集索引

SQL:
select * from A,B where A.code=B.code

执行计划中看到的是:
1、对A表的table scan
2、对B表的table scan
3、而后对1、2的进行hash match


问题:
都说索引对于表连接是起作用的,
可从这个执行计划看来,实在是看不出索引对于表连接的作用
为什么?
...全文
119 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
SQL77 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhangsong841 的回复:]
引用 5 楼 sql77 的回复:
都在code 字段上有非聚集索引,且唯一。


非聚集索引,如果要扫描所有数据,当然是扫描表啦,

非聚集索引不包含所有列,肯定RID花费更多

直接表扫描就好

sql77 也看看我在7楼的回复吧,
先谢了
[/Quote]

听KG哥的,确实,就算方案2建立了包含性索引,
其实也就相当于表了,建立聚集索引就更不用说了,
因为你没有筛选条件,有条件的话,建立索引就不同了
zhangsong841 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sql77 的回复:]
都在code 字段上有非聚集索引,且唯一。


非聚集索引,如果要扫描所有数据,当然是扫描表啦,

非聚集索引不包含所有列,肯定RID花费更多

直接表扫描就好
[/Quote]
sql77 也看看我在7楼的回复吧
先谢了
feixianxxx 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhangsong841 的回复:]

引用 8 楼 feixianxxx 的回复:
引用 7 楼 zhangsong841 的回复:

那是一般情况

优化器是会选择的~

仔细看下我在7楼的回复吧

是kg哥正确还是您正确????
我都有点晕了。。。
[/Quote]
听 KG哥的、、

我的不对
zhangsong841 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 feixianxxx 的回复:]
引用 7 楼 zhangsong841 的回复:

那是一般情况

优化器是会选择的~
[/Quote]
仔细看下我在7楼的回复吧

是kg哥正确还是您正确????
我都有点晕了。。。
Garnett_KG 2010-05-16
  • 打赏
  • 举报
回复
看来方案1:和方案2:岂不是一样?
>>>
YES

而且方案2:根本就不需要建索引。
>>>
YES
feixianxxx 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhangsong841 的回复:]

有两个结果集,
结果集a :select aid ,sum(..),count(..).... from biaoa where .... group by aid;
结果集b :select bid ,sum(..),count(..).... from biaob where .... group by bid;
这两个结果集都有200万条多的记录,且aid和bid是能关连的,且每条记……
[/Quote]
那是一般情况

优化器是会选择的~
zhangsong841 2010-05-16
  • 打赏
  • 举报
回复
有两个结果集,
结果集a :select aid ,sum(..),count(..).... from biaoa where .... group by aid;
结果集b :select bid ,sum(..),count(..).... from biaob where .... group by bid;
这两个结果集都有200万条多的记录,且aid和bid是能关连的,且每条记录都能关联上。


我想生成表tc,是select * from 结果集a,结果集b where 结果集a.aid=结果集b.bid.

方案1: insert into tc
with ta as
( 形成结果集a 的sql ),
tb as
( 形成结果集b 的sql )
select * from ta,tb where ta.aid=tb.bid
方案2: 建表ta ,把 结果集a直接insert 进ta ,再在 ta的列aid上建索引
建表tb ,把 结果集b直接insert 进tb ,再在 tb的列bid上建索引,
然后 insert into tc select * from ta,tb where ta.aid=tb.bid


------------------------------------------
我在3月4日提出过这个问题的帖子,上面是该帖的内容
当时楼上的sql77和poofly都认为方案2:更好点,



可照现在楼上的观点
看来方案1:方案2:岂不是一样?
而且方案2:根本就不需要建索引。

高手们看看吧??



htl258_Tony 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 garnett_kg 的回复:]
索引在有选择时才有用

就算CODE上有聚集索引,你得查询还是SCAN,你不带任何条件,当然是SCAN更高效。
[/Quote]
正解,学习~
SQL77 2010-05-15
  • 打赏
  • 举报
回复
都在code 字段上有非聚集索引,且唯一。


非聚集索引,如果要扫描所有数据,当然是扫描表啦,

非聚集索引不包含所有列,肯定RID花费更多

直接表扫描就好
feixianxxx 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 garnett_kg 的回复:]

索引在有选择时才有用

就算CODE上有聚集索引,你得查询还是SCAN,你不带任何条件,当然是SCAN更高效。
[/Quote]
day day study from KG borther ~
Garnett_KG 2010-05-15
  • 打赏
  • 举报
回复
索引在有选择时才有用

就算CODE上有聚集索引,你得查询还是SCAN,你不带任何条件,当然是SCAN更高效。
htl258_Tony 2010-05-15
  • 打赏
  • 举报
回复
帮顶。
sql_lover 2010-05-15
  • 打赏
  • 举报
回复
都没有主键么,没有聚集索引的话,索引的是B树存的堆里面的链接。
你试试这样写:
select * from B,A where B.code=A.code

22,209

社区成员

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

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