索引使用的次序和查询的效率有关?如果有如何改变索引使用次序?

[复制链接]
查看11 | 回复9 | 2007-1-24 14:35:02 | 显示全部楼层 |阅读模式
如题
回复

使用道具 举报

千问 | 2007-1-24 14:35:02 | 显示全部楼层
如有两张表A,B做连接,A的数据量100万,B只有1000,连接的时候分别使用了索引A1,B1
两索引使用的次序和查询执行的效率有关?
如果有如何改变索引使用次序?
回复

使用道具 举报

千问 | 2007-1-24 14:35:02 | 显示全部楼层
不应该说是索引的使用次序,应该是表的访问次序,也就是所谓的驱动表。
举个简单的例子(a,b 如你所说):
select * from a,b where a.cm=b.cn and a.pk=xx;
优化器会先使用a.pk的索引选择a 的记录然后再去取b的记录(nested loop)(是否使用b.cn上的索引要视需要取出的数据量而定)
但是select * from a,b where a.cm=b.cn ;
一般的情况下优化器会取出b 散列(不使用索引) 然后去取a(TABLE ACCESS FULL )进行匹配(hash join)
CBO一般简单的情况下会做出正确的选择,但是对于比较复杂的情况需要人为调整 使用hints
建议看看oracle文档中Performance Tuning Guide and Reference
等方面的文章,多调一些sql。
回复

使用道具 举报

千问 | 2007-1-24 14:35:02 | 显示全部楼层
用CBO,收集统计信息,会自动选择的
回复

使用道具 举报

千问 | 2007-1-24 14:35:02 | 显示全部楼层
先谢了,这么快就回复
首先你说的驱动表只有在RULE优化器中才有效
而且做为基表的应该选择数据比较少的
优化的话应该是小表关联大表吧
那用HINT怎么在其他优化器下改变这样的关联的次序?
回复

使用道具 举报

千问 | 2007-1-24 14:35:02 | 显示全部楼层
to feimei:
首先你说的驱动表只有在RULE优化器中才有效
而且做为基表的应该选择数据比较少的
优化的话应该是小表关联大表吧
那用HINT怎么在其他优化器下改变这样的关联的次序?
我觉得驱动表 只是说访问次序的问题,跟rbo,cbo没什么直接的关系,只是CBO中因为优化器能够更准确的选择执行计划而使得这个概念淡化了。
而且做为基表的应该选择数据比较少的第一个例子中因为使用了主键选择的数据较少,虽然本身很大,但是他还是驱动表。
hint 当然是CBO才能识别,建议尽量使用CBO。(RBO中oracle从右往左分析from中的表。)
回复

使用道具 举报

千问 | 2007-1-24 14:35:02 | 显示全部楼层
我想你误会了,这两个表关联的时候使用了两张表的索引,只是次序是先用数据量比较小的表的索引,然后用数据量大的表的索引。我想知道这样倒过来对查询的效率有影响吗?
回复

使用道具 举报

千问 | 2007-1-24 14:35:02 | 显示全部楼层
1、先访问哪个表不是看他的大小而是看从这个表中访问返回的数据集的大小(如果只有连接条件而没有过滤条件像我举的例子中的第二个当然就是取决于表的大小了,但是这种情况下可能不使用索引,所以我确实不理解你说的)。
2、放过来访问当然对性能影响很大:nested loop中先访问的那个表的数据量决定了访问另外一个表的次数(循环访问),如果数据量大的话会造成重复访问第二个表次数过多(请注意,类似的情况下缓存命中率可能很高,这往往使得一些人单纯的看缓存命中率而没有意识到存在问题)。hash join 中大表先取出来被hash 的话意味着更多的cpu,更多内存如果过大还会使用临时表空间。
回复

使用道具 举报

千问 | 2007-1-24 14:35:02 | 显示全部楼层
了解
能说说怎样强行修改查询表的次序?
谢谢
回复

使用道具 举报

千问 | 2007-1-24 14:35:02 | 显示全部楼层
我试过在CBO模式下,但是还是错误的选择
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行