帮助优化Oracle查询?

时间:2009-05-26 17:41:42

标签: 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
);

2 个答案:

答案 0 :(得分: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
);

所以它真的很简单:

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

我认为让这个最快的方法是在人员表上设置relationship_type_idfamily_numberperson_id的索引。

答案 1 :(得分:0)

为了帮助您进行调整,您可以发布以下信息:

1)对于涉及的表,它们在表上的表定义和索引定义。 2)每个表中大致行数的基本运行 3)查询的解释计划。得到解释计划:   a)在sqlplus中运行      解释计划SET STATEMENT_ID = for&lt;插入您的查询&gt ;;   b)在sqlplus中运行      select * from table(dbms_xplan.display('PLAN_TABLE',''));

通过解释计划和表/索引信息,我们可以帮助您更好地调整查询。只有查询我们真的没什么可走的。如果您可以提供查询执行的tkprof,那么这也会有额外的帮助。