2009-05-26 131 views
1

我试图从这个Oracle查询中获得更好的性能(这非常慢)。我是一名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 
); 
+0

对于特定的查询,如果您可以提供指向某个地方的链接以下载几个表创建脚本和一些测试数据,这将会很有帮助 - 这就是我验证我提出的任何解决方案的方式。很高兴你得到了答案。 – 2009-05-26 20:00:49

回答

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_id,family_number,person_id索引。

+0

是的,你是对的。我过于复杂的查询。 :) 感谢您的提示! – 2009-05-26 18:17:13

0

为了帮助你调整,你可以发布以下信息:

1)对于涉及到的表,他们的表定义和表上的索引定义。 2)每个表 中的大致行数的基本运行3)查询的解释计划。得到一个解释计划: a)在sqlplus中运行 explain plan SET STATEMENT_ID = for < insert your query>; b)在sqlplus中运行 select * from table(dbms_xplan.display('PLAN_TABLE',''));

通过解释计划和表/索引信息,我们可以帮助您更好地调整查询。仅仅通过查询,我们确实没有太多的事情要做。如果您可以提供查询执行的tkprof,那也会有额外的帮助。