表连接查询时 大表在前小表在后(是说的字段少的还是数据量少的??) 为什么

 我来答
帐号已注销
高粉答主

2020-04-04 · 每个回答都超有意思的
知道答主
回答量:2169
采纳率:0%
帮助的人:36.5万
展开全部

因为表连接查询时后面的表必然会进行全表扫描,所以数据少的放后面,提高sql语句的执行效率。操作方法如下:

1、首先优化原则,小表驱动大小,即小的数据集驱动大的数据集。

2、select * from A where id in(select id from b),当B表的数据集必须小于A表的数据集时,用in优于exists。

3、select *from A where exists (select 1 from B where b.id=a.id)。当A表的数据集小于B表的数据集时,用exists优于in。

4、exists(subquery)只返回true或false,因此子查询中的select * 也可以是select 1 或select 'x',官方说法是实际执行时会忽略掉select清单,因此没有区别。

5、exists子查询的实际执行过程可能经过优化而不是理解上的逐条对比,如果担忧效率问题,可进行实际建立以确定是否有效率问题。

6、exists子查询往往也可以用条件表达式,其他子查询或者join来替代,何种最优需要具体问题具体分析

psychic0111
推荐于2017-11-25 · TA获得超过999个赞
知道小有建树答主
回答量:463
采纳率:100%
帮助的人:223万
展开全部
数据量少,表连接查询时后面的表必然会进行全表扫描,所以数据少的放后面,提高sql语句的执行效率
追问
前面的表不用全表扫描吗?   执行过程是什么样子的呢?谢谢
追答
ORACLE会把FROM子句最后面的一个表做为基表(后表),查询所有记录并对记录进行排序,然后扫描第二个表(前表),将所有从第二个表中检索出的记录与第一个表中合适记录进行合并,这里是可以命中索引的。如果等值连接,那就是:前表.字段A=后表字段B值,那字段A会用到索引。

实际上ORACLE的表联接查询要比我说的复杂,刚刚查了下资料,用到了一种叫hash join的功能,最简单,效率最高的hash join就是当驱动结果集生成的hash表全部可以放入PGA的hash area时,称为optimal,大致过程如下:

1.先根据驱动表,就是基表,得到驱动结果集

2.在hash area生成hash bulket,并将若干bulket分成一组,成为一个partition,还会生成一个bitmap的列表,每个bulket在上面占一位

3.对结果集的join键做hash运算,将数据分散到相应partition的bulket中,当运算完成后,如果键值唯一性较高的话,bulket里的数据会比较均匀,也有可能有的桶里面数据会是空的,这样bitmap上对应的标志位就是0,有数据的桶,标志位会是1

4.开始扫描第二张表,对jion键做hash运算,确定应该到某个partition的某个bulket去探测,探测之前,会看这个bulket的bitmap是否会1,如果为0,表示没数据,这行就直接丢弃掉

5.如果bitmap为1,则在桶内做精确匹配,判断OK后,返回数据
这个是最优的hash join,如果表太大了,那么ORACLE会将表拆分成几个分区,分次放入hash area。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式