2017-03-28 3 views
-1

J'ai une question pour le rapport:requête SQL a plus de lignes plus courtes retour

select 
    hp.KOD, hp.AD, hp.HES_ID, 
    sum(fs.BORC_TUTARI) B_T, 
    sum(fs.ALACAK_TUTARI) A_T, 
    max(hp.UST_HESAP_ID) UST_HESAP_ID, 
    max(hp. ALT_HESAP_SAYISI) ALT_HESAP_SAYISI 
from 
    W_HES_PLAN hp, FIS_SATIRLARI fs, FIS_BASLIGI FB, 
    (select h.HESAP_KODU HESKOD, FS.HESAP_ID, FS.FIS_ID 
    from HESAP_PLANI H, FIS_SATIRLARI fs 
    where H.HESAP_ID = FS.HESAP_ID  
    group by h.HESAP_KODU,FS.HESAP_ID, FS.FIS_ID) CC 
where 
    CC.HESKOD like HP.KOD+'%' 
    and FB.FIS_ID = FS.FIS_ID 
    and CC.HESAP_ID = fs.HESAP_ID 
    and CC.FIS_ID = FS.FIS_ID 
    -- and hp.KOD>='' and hp.KOD<='200' 
group by 
    hp.KOD, hp.AD, hp.HES_ID 
order by 
    HP.KOD 

sous-requête de la table CC retourne 676.427 lignes en 7 sec, mais toutes requête retourne 14.000 lignes dans 23 min.I ne peut pas Comprendre cela.Pourquoi plus de lignes sont-elles plus courtes? Toute suggestion d'optimisation?

+0

Si vous souhaitez obtenir de l'aide sur les performances, veuillez fournir le plan d'exécution de la requête pour la sous-requête elle-même et pour la requête globale. Aussi, je recommanderais de supprimer les jointures implicites, il est difficile de dire comment vos tables sont jointes. – mallan1121

+1

[Mauvaises habitudes à lancer: en utilisant les anciens JOINs] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins. aspx) - que l'ancien style * la liste des tables * style séparé par des virgules a été remplacé par la syntaxe * proper * ANSI 'JOIN' dans l'ANSI - ** 92 ** SQL Standard (** il y a 25 ans **) et son l'utilisation est déconseillée –

+0

Conceptuellement, je ne pense pas qu'il soit difficile de comprendre pourquoi l'ensemble de la requête prend plus de temps, même si elle renvoie moins de lignes. Il repose sur la requête interne, donc vous vous attendez à ce qu'elle dure au moins aussi longtemps que la requête interne. De plus, vous ajoutez les frais de l'extérieur (y compris 'like'). Et l '«addition» peut fonctionner plus comme une multiplication en termes de frais généraux. Le nombre de lignes n'est pas non plus important lorsque vous utilisez l'agrégation dans le résultat. Combien de lignes si vous ne cumulez pas? C'est une question rhétorique, vous n'avez pas besoin de répondre. –

Répondre

0

Je suppose que le problème de performance provient du fait que vous utilisez toujours les jointures de style ANSI-89 qui vous ont donné une jointure croisée là où vous n'en vouliez pas. Voici votre requête traduite en jointures de style ANSI-92. Sinc eyou n'a pas de prédicat où regarder W_HES_PLAN et FIS_SATIRLARI vous avez une jointure croisée. J'ai le sentiment que ce n'est pas ce que vous voulez. Cela entraînera d'énormes problèmes de performances et des valeurs probablement incorrectes.

select 
    hp.KOD 
    , hp.AD 
    , hp.HES_ID 
    , sum(fs.BORC_TUTARI) as B_T 
    , sum(fs.ALACAK_TUTARI) as A_T 
    , max(hp.UST_HESAP_ID) as UST_HESAP_ID 
    , max(hp. ALT_HESAP_SAYISI) as ALT_HESAP_SAYISI 
from 
    W_HES_PLAN hp 
    cross join FIS_SATIRLARI fs 
    join FIS_BASLIGI FB on FB.FIS_ID = FS.FIS_ID 
    join 
    (
     select h.HESAP_KODU HESKOD 
      , FS.HESAP_ID 
      , FS.FIS_ID 
     from HESAP_PLANI H 
     join FIS_SATIRLARI fs on H.HESAP_ID = FS.HESAP_ID  
     group by h.HESAP_KODU 
      ,FS.HESAP_ID 
      , FS.FIS_ID 
    ) CC on CC.HESKOD like HP.KOD+'%' 
     and CC.HESAP_ID = fs.HESAP_ID 
     and CC.FIS_ID = FS.FIS_ID 
    -- and hp.KOD>='' and hp.KOD<='200' 
group by 
    hp.KOD 
    , hp.AD 
    , hp.HES_ID 
order by 
    HP.KOD 
+0

'Like' peut être coûteux. Où vous et @SeanLange avez 'CC.HESKOD comme HP.KOD + '%'' cela pourrait valoir la peine d'essayer 'Left (CC.HESKOD, len (HP.KOD)) = HP.KOD'. Je ne ferai aucune promesse, mais c'est une approche qui a parfois fonctionné pour moi. –

+0

merci Sean mais rien n'a changé.Retourné en 23 min .. Et @SteveLovell J'ai aussi essayé votre suggestion.Même résultat en même temps. – serdar

+0

Si vous avez la chance pour 'HP.KOD' d'avoir toujours la même longueur, vous devriez remplacer cette longueur par la fonction' LEFT' que j'ai donnée plutôt que de la calculer. J'y reviendrai quand le temps le permettra. –