帮助优化Oracle查询?

Kev*_*ock 1 oracle optimization

我试图从这个Oracle查询中获得更好的性能(这非常慢).我是Oracle初学者,所以也许有人可以指出一种更好的方法来处理这个问题.

我有一张表格,里面有关于不同家庭的信息.我想根据关系类型提取不同的关系.我想出的解决方案使用散列连接来查询数据库...

select *
from (
  with target_person as (
    select 
      p.person_id,
      p.family_number,
      p.relationship_type_id
    from 
      people p
    where
      p.relationship_type_id = 1 -- parent
  )
  select
    target_person.person_id,
    related_person.related_person_id,
    related_person.relationship_type_id
  from
    target_person,
    people related_person
  where
    target_person.person_id != related_person.person_id
    and target_person.family_number = related_person.family_number
    and related_person.relationship_type_id = 1
);
Run Code Online (Sandbox Code Playgroud)

Cad*_*oux 6

你意识到这相当于这个?:

select *
from (
  with target_person as (
    select 
      p.person_id,
      p.family_number,
      p.relationship_type_id
    from 
      people p
    where
      p.relationship_type_id = 1 -- parent
  )
  select
    target_person.person_id,
    related_person.related_person_id,
    related_person.relationship_type_id
  from
    target_person,
    target_person related_person
  where
    target_person.person_id != related_person.person_id
    and target_person.family_number = related_person.family_number
);
Run Code Online (Sandbox Code Playgroud)

所以它真的很简单:

SELECT *
FROM people AS l
INNER JOIN people AS r
ON l.family_number = r.family_number
    AND l.relationship_type_id = 1
    AND r.relationship_type_id = 1
    AND l.person_id <> r.person_id
Run Code Online (Sandbox Code Playgroud)

我想的办法让这个去最快的是有一个索引relationship_type_id,family_number,person_id你的百姓餐桌.