join 索引 oracle,pl/sql中left join 和关联子查询 走索引的问题

本帖最后由 hedvahu 于 2017-9-7 16:16 编辑

现有下列sql语句,在不同的环境下执行,显示的执行计划不同,不知道什么原因:

1.STAFF 员工表 索引 party_id

2.PARTY_CONTACT_INFO 记录员工电话号码,索引 party_id

sql语句如下:

select *

from STAFF js

left join PARTY_CONTACT_INFO jpci

on js.party_id = jpci.party_id;

在测试环境的执行计划:

---------------------------------------------------------------------------------------------------------------

| Id  | Operation                    | Name                           | Rows  | Bytes | Cost (%CPU)| Time     |

---------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT             |                                |   113K|   436M| 42882   (1)| 00:08:35 |

|   1 |  NESTED LOOPS OUTER          |                                |   113K|   436M| 4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值