Помогите оптимизировать запрос Oracle? - PullRequest
1 голос
/ 26 мая 2009

Я пытаюсь повысить производительность этого запроса 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 ]

6 голосов
/ 26 мая 2009

Вы понимаете, что это эквивалентно этому:

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 голосов
/ 27 мая 2009

Чтобы помочь вам с настройкой, вы можете опубликовать следующую информацию:

1) Для задействованных таблиц: определения таблиц и определения индексов в таблицах. 2) Базовое сокращение приблизительного количества строк в каждой таблице 3) объяснить план запроса. чтобы получить план объяснения: а) запустить в sqlplus объяснить план SET STATEMENT_ID = для <вставить свой запрос>; б) запустить в sqlplus выберите * из таблицы (dbms_xplan.display ('PLAN_TABLE', ''));

С помощью плана объяснения и информации о таблице / индексе мы можем помочь вам лучше настроить запрос. С одним запросом нам действительно не о чем идти. Если вы можете предоставить tkprof выполнения запроса, это также может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...