我使用WITH子句,其中我基于使用位图索引的列从4个表构建表。假设来自表1列col1和来自表2的列col2具有bitmnap索引。这是相当快,我得到一个结果作为一个table_A,其中有10列,其中有col1和col2。
在后面的过程中,a将使用join或exists,如
select * from table_XY
where exists (
select 1 from table_A
where col1= table_XY.colx and col2=table_XY.coly
)
- tableXY没有索引,Oracle是否会扫描整个table_A以查找第一个匹配项,或者Oracle是否使用了索引?2.如果Oracle可以使用索引,因为table_A只是WITH子句中多个表的构造,那么唯一的改进就是在tableXY中有和索引?如果tableXY也是另一个WITH子句中的一个构造,该怎么办?
1条答案
按热度按时间gywdnpxw1#
制定一个解释计划,然后你就知道答案了。您需要使用整个SQL,而不仅仅是上面分享的那一部分。..您提到的WITH子句将需要成为其中的一部分:
然后读取输出。有很多指南在那里就如何阅读解释计划。它会告诉你Oracle打算如何处理你的查询。
如果Oracle决定具体化您的
WITH
子句(将其结果存储在SQL持续时间临时表中),请记住,该临时表没有也不能以任何方式进行索引。但它可能不需要这样- Oracle可能会重写您的查询,以便它可以通过对临时表的散列连接来完成它。如果Oracle决定 * 不 * 物化视图,而是合并它,它可能会访问基表,然后可能会使用索引,这取决于它从table_XY
估计的基数以及这些索引上的统计信息。我们无法预测在这个论坛中,只有解释计划会告诉你。不要担心尝试让它使用索引作为您的首要关注点。你首先关心的是,它的性能是否可以接受?如果是这样,继续前进。如果没有,生成解释计划并找出它正在犯什么错误,并应用适当的补救措施来纠正它。我不能用一般性的东西来更具体地说明--有太多的可能性,调优只能在内部通过访问您的数据、完整的SQL、表结构、解释计划和ASH(
v$active_session_history
)数据来正确完成。