2011-11-09 4 views
3

J'ai une requête qui ressemble à ci-dessous et les tables A, T, S ont environ 1 million de lignes alors que P ont plus de 100 millions de lignes. J'ai récemment introduit la vue en ligne "temp" dans cette requête et cela a causé une dégradation drastique des performances. Les données récupérées pour temp sont à peine 50 lignes et cette requête inline s'exécute en un clin d'oeil lorsqu'elle est exécutée seule. Les statistiques autotrace montrent une augmentation énorme du nombre de "consistantes obtient" d'un nombre de 6 chiffres avant d'introduire la température à un nombre de 9 chiffres après l'avoir ajouté !! En outre, plus de 90% de LAST_CR_BUFFER_GETS sont comptabilisés pour la vue "temp". Si j'extrais les données de cette vue dans une table temporaire et que j'utilise cette table dans le cadre des jointures, la performance est très bonne mais cette solution n'est pas vraiment réalisable pour moi.Problème de performances avec la vue en ligne dans Oracle

Je sais que la question est très généralisée mais je me demande s'il y a quelque chose de trivial dans l'utilisation de cette vue en ligne. Les vues en ligne n'offrent-elles pas les mêmes performances que si elles contenaient ces données dans une table temporaire? Y at-il un moyen de suggérer à Oracle d'utiliser cette vue de manière efficace et d'augmenter ainsi les performances?

select t.id, 
      a.date 
    from A a, 
      T t, 
      P p, 
      S s, 
      (select id 
      from S, 
        R 
      where s.id = r.id 
       and r.code = 10 
        r.code1 = 20 
        r.name = 'string1') temp 
    where ...cond1 
      ...cond2 
      ...cond2 
    s.id = temp.id 
+2

Bonjour, Pourriez-vous publier votre plan de requête? –

+1

Affichez la requête actuelle (la vôtre contient des erreurs de syntaxe dans tout le magasin) et le plan d'explication, les tailles de table, etc. et nous pourrons commencer. – Ollie

+3

On dirait que l'estimation de la cardinalité pour la sous-sélection est loin. Ayez une lecture de [ce document] (http://www.oracle.com/technetwork/database/focus-areas/bi-datawarehousing/twp-explain-the-explain-plan-052011-393674.pdf) – Gaius

Répondre

0
WITH TEMP AS 
(select id 
     from S, 
       R 
     where s.id = r.id 
      and r.code = 10 
       r.code1 = 20 
       r.name = 'string1') 
select t.id, 
     a.date 
from A a, 
     T t, 
     P p, 
     S 
where ...cond1 
     ...cond2 
     ...cond2 
s.id = temp.id; 

essayez d'exécuter cette requête, et s'il vous plaît fournir l'expliquer le plan pour cette requête

1

Meilleure estimation, basée sur mon expérience d'accord est il est d'évaluer probablement la vue en ligne « temp "une fois par enregistrement correspondant à l'ensemble de résultats obtenu en joignant A, t, p, s. La meilleure solution ici est de le réécrire de cette façon. Gardez à l'esprit que l'indicateur ORDERED suppose que vous fournissez les tables dans la clause FROM dans l'ordre dans lequel vous souhaitez les joindre. J'ai listé temp et s en premier, cos c'est la seule condition de jointure que vous avez listée temp.id = s.id. Aussi, je suppose que vous avez des index sur toutes les autres colonnes qui font partie des critères de jointure. Faîtes moi savoir si vous avez d'autres questions.

select /*+ ordered use_nl(a t p s) */ 
    t.id, a.date 
from (
    select id 
    from S, 
     R 
    where s.id = r.id and r.code = 10 r.code1 = 20 r.name = 'string1' 
    ) temp, 
    S s, 
    A a, 
    T t, 
    P p 
where ...cond1 ...cond2 ...cond2 and s.id = temp.id 
Questions connexes