我正试图从这个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 :(得分: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
的索引。
答案 1 :(得分:0)
为了帮助您进行调整,您可以发布以下信息:
1)对于涉及的表,它们在表上的表定义和索引定义。 2)每个表中大致行数的基本运行 3)查询的解释计划。得到解释计划: a)在sqlplus中运行 解释计划SET STATEMENT_ID = for&lt;插入您的查询&gt ;; b)在sqlplus中运行 select * from table(dbms_xplan.display('PLAN_TABLE',''));
通过解释计划和表/索引信息,我们可以帮助您更好地调整查询。只有查询我们真的没什么可走的。如果您可以提供查询执行的tkprof,那么这也会有额外的帮助。