oracle left join走不到索引问题分析

写了个left join语句,如下:

select A.c,B.d

from A

left join B

on A.a = B.a

and A.b = B.b

对A表的a, b字段和B表的a, b字段都建了联合索引, 发现on后的条件怎么也走不到索引

查到有个说法是只有where后的语句可以走到索引,试着改为(+)

select A.c,B.d

from A, B

where A.a = B.a(+)

and A.b = B.b(+)

一样走不到索引。

查到有说法是left join和 (+)其实一样一样的。

会不会测试环境 的数据量太小了?

果然是,测试环境只有100条数据,生产上数据量为100万,在生产上就生效了。

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Oracleleft join索引可能是由于以下原因: 1. 表中没有适当的索引,导致查询时需要进行全表扫描,从而降低了查询效率。 2. 查询条件中使用了不等于操作符(<>),这会导致Oracle无法使用索引进行优化,从而导致查询效率降低。 3. 查询条件中使用了函数或表达式,这会导致Oracle无法使用索引进行优化,从而导致查询效率降低。 4. 表中的数据量过大,导致查询时需要进行大量的IO操作,从而降低了查询效率。 为了解决这个问题,可以采取以下措施: 1. 在表中添加适当的索引,以便Oracle可以使用索引进行优化。 2. 避免使用不等于操作符(<>),尽可能使用等于操作符(=)。 3. 避免在查询条件中使用函数或表达式,尽可能使用简单的查询条件。 4. 对于数据量过大的表,可以考虑使用分区表或分区索引来提高查询效率。 ### 回答2: 对于Oracleleft join索引的情况,需要从多个方面进行分析和排查,以下是可能的原因: 1. 表中没有合适的索引 如果在执行left join时没有找到合适的索引,那么Oracle会选择使用全表扫描的方式来获取数据,这个过程会非常缓慢。 可以通过使用explain plan等查询语句,查看Oracle查询计划,以确定是否有正确的索引。如果确实没有合适索引,需要在表中添加相应的索引。 2. 查询过于复杂 如果查询语句过于复杂,包括过多的表连接、子查询或者大量的where条件,可能会导致Oracle无法有效地使用索引进行优化,进而产生left join索引的现象。 需要对查询语句进行优化,保持简单,缩短查询时间,尝试分解查询语句并使用内部表连接等方式进行优化。 3. 存在空值 如果left join的表中存在空值,由于Oracle不会对空值建立索引,也会导致查询不索引的情况。这时可以通过使用COALESCE函数来解决,将null值替换为0或其他有效值,以保证正确的查询结果。 4. 数据库统计信息不准确 如果数据库中的统计信息不准确或过期,也可能导致left join索引。因此需要定期更新或重新收集数据库中的统计信息,以确保索引的使用优化。 总之,对于left join索引的情况,需要从多个方面进行排查和优化,根据具体情况进行分析和调整,以保障查询效率和正确性。 ### 回答3: 在使用 Oracle 数据库时,left join索引问题可能是由以下原因导致的: 一、left join 中的 ON 子句没有使用索引。如果 ON 子句中的条件不使用索引Oracle 将不得不扫描整个表,对于大型表来说,这将非常耗时。 二、left join 中的 WHERE 子句没有使用索引。如果 WHERE 条件中的列没有索引Oracle 也将不得不扫描整个表,这将导致查询变慢。 三、索引已过时。如果表上的数据已更改,但索引没有被更新,那么查询时就可能不会使用索引。在这种情况下,需要重新生成或重建索引,以确保数据和索引保持同步。 四、大量重复值。如果 left join 中的列具有大量重复值,那么索引将不起作用。相反,Oracle 将不得不扫描整个表。 五、数据分布不均。如果表中的数据分布不均,那么索引可能无法使用。有些值出现得太频繁,而有些值很少出现,这将导致 Oracle 选择扫描整个表而不是使用索引。 为了解决左连接不索引问题,我们可以采用以下方法: 一、使用索引优化查询。我们可以通过分析查询语句和表结构来确定哪些列需要索引,然后创建或修改索引,以便更快地检索数据。 二、使用子查询代替 left join。在某些情况下,使用子查询可以更快地检索数据,特别是当查询的列不是主键或唯一键时。 三、优化查询语句。我们可以通过重新编写查询语句,使用更少的表或更简单的条件来优化查询。这可以提高查询性能并减少不必要的资源消耗。 四、使用分区。使用分区可以将大型表分成多个较小的表,从而提高查询性能并减少资源消耗。 在 Oracle 数据库中使用 left join 查询可能会不索引,这可能是由多种原因导致的。通过使用适当的索引、优化查询语句和使用分区等方法,我们可以提高查询性能并减少不必要的资源消耗。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值