2009-05-26 7 views
1

J'essaie d'obtenir de meilleures performances avec cette requête Oracle (qui est terriblement lente). Je suis un débutant Oracle alors peut-être quelqu'un peut vous indiquer une meilleure façon d'aborder cette requête.Aidez-nous à optimiser une requête Oracle?

J'ai une table avec des informations sur différentes familles. Je veux extraire les différentes relations en fonction d'un type de relation. La solution que je suis venu avec utilise une jointure de hachage pour interroger la base de données ...

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

Pour une requête spécifique, il serait utile que vous fournissiez un lien vers un endroit où télécharger quelques tables crée des scripts et un peu de données de test - c'est ainsi que je vérifierais toute solution que je proposerais. Je suis content que vous ayez une réponse. –

Répondre

6

Vous réalisez cela équivaut à cette ?:

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 
); 

Il est vraiment aussi simple que cela:

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 

Je pense que la façon d'obtenir ce pour aller le plus rapide est d'avoir un index sur relationship_type_id, family_number, person_id sur votre table de personnes.

+0

Oui, vous avez absolument raison. Je compliquais trop la requête. :) Merci pour le pourboire! –

0

Pour vous aider accordage pouvez-vous envoyer les informations suivantes:

1) Pour les tables impliquées, leur définition de la table et les définitions d'index sur les tables. 2) Une réduction de base du nombre approximatif de lignes dans chacune des tables 3) Un plan d'explication de la requête. pour obtenir un plan d'explication: a) exécuter dans sqlplus explain plan SET STATEMENT_ID = pour < insérer votre requête>; b) exécuter dans sqlplus select * from table (dbms_xplan.display ('PLAN_TABLE', '')); Avec un plan d'explication et des informations sur les tables/index, nous pouvons vous aider à mieux ajuster la requête. Avec juste la requête, nous n'avons vraiment pas grand chose à faire. Si vous pouvez fournir un tkprof de l'exécution de la requête, cela serait également utile.

Questions connexes