【问题标题】:Help optimize an Oracle query?帮助优化 Oracle 查询?
【发布时间】:2009-05-27 04:30:48
【问题描述】:

我正试图从这个 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
);

【问题讨论】:

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

标签: oracle optimization


【解决方案1】:

你意识到这等同于这个吗?:

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 的索引。

【讨论】:

  • 是的,你完全正确。我使查询过于复杂。 :) 感谢您的提示!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2014-02-06
    • 2011-05-06
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多