IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Adaptive Server Enterprise Sybase Discussion :

[ASE 12.5.4] Optimisation requête + not existes


Sujet :

Adaptive Server Enterprise Sybase

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2003
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2003
    Messages : 148
    Points : 118
    Points
    118
    Par défaut [ASE 12.5.4] Optimisation requête + not existes
    Bonjour,
    J'ai une procedure stockée dont il y a un bout de code ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    create table #UserInfos (id_fonds int)
          If (@IdUser Is Not Null)
            Begin
              insert into #UserInfos
                   select id_fonds
                     from reporting..CDXv_HAB_UserFds uf
                    where uf.login = convert(int,@IdUser)
     
              Delete #RESULTAT
               where not exists (select 1
     
                 from #UserInfos uf, GDC_DOCUMENT d, CDX_RQC_Fonds_Commande fc
                                  where #RESULTAT.IdDocument = d.IdDocument
                                    and fc.IdVersionCommande = d.IdVersionCommande
     
       and fc.iIDFonds   = uf.id_fonds)
    J'ai beaucoup des io logiques lors de l'execution de cette procedure par plusieurs utilisateurs et aussi beaucoup de création des tables temporaires comme en temoigne les infos ci-dessous de asemonlogger:
    Statement Info :
    Statement Statistics :

    StmtID : 37566867
    StartTime : Jan 7 2010 11:56AM
    Elapsed_s : 41.593
    Login : dieudo
    Application : test
    ClientHost : titss532
    ClientIP : 159.50.136.11
    ClientOSPID : null
    DBID : 5
    ProcName : Gproc_SelectDoc
    LineNumber : 228
    SPID : 813
    KPID : 1782317456
    PlanID : 15586728
    BatchID : 547
    ContextID : 2
    CpuTime : 41620
    WaitTime : 0
    MemUsageKB : 14
    PhysicalReads : 0
    LogicalReads : 4640999
    PagesModified : 0
    PacketsSent : 0
    PacketsReceived : 0
    NetworkPacketSize : 2048
    PlansAltered : 0
    RowsAffected : 0

    Remark : Statistics information is not exact due to the sampling

    Objects Statistics
    DBName Owner ObjectName ObjectType IndexID L_Reads P_Reads P_APFReads TblSize(Kb)
    bfond 1 GDC_DOCUMENT user clustered index 1 188508 0 0 21200
    tempdb_CDX 2 #RESULTAT____01008130012524728 user table 0 0 0 0 9086
    tempdb_CDX 2 #RESULTAT____01008130012524728 user table 0 4362 0 0 9086
    tempdb_CDX 2 #UserInfos___01008130012524728 user table 0 4495959 0 0 490
    est ce qu'il ya une autre possibilité de réecrire autrement la partie sur le delete ?
    Merci de vos conseils.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Si je réecris le delete en ANSI:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     DELETE #RESULTAT
               WHERE NOT EXISTS (SELECT 1
     
                 FROM
                    GDC_DOCUMENT d
                    join CDX_RQC_Fonds_Commande fc
                        on  fc.IdVersionCommande = d.IdVersionCommande
                    join #UserInfos uf
                        on uf.id_fonds = fc.iIDFonds
                where
                    d.IdDocument = #RESULTAT.IdDocument)
    on constate qu'un index sur #UserInfos.id_fonds pourrait être utile (si tu le crée il faut le forcer dans la requête via un (index ...))
    Il faut évidemment que les autres colonnes utilisées dans la jointure soient indexées. Logiquement, l'ordre de jointure devrait etre celui dans lequel j'ai mis les tables dans la clause FROM du NOT EXISTS - donc un forceplan pourrait aussi être efficace si les table tempo sont un peut grande...

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2003
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2003
    Messages : 148
    Points : 118
    Points
    118
    Par défaut
    Merci mpeppler, je voudrais savoir pourquoi en créant l'index, il faut le forcer pour qu'il soit utiliser ? Merci.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Si c'est dans une proc stockée, alors l'optimizeur ne va pas prendre en compte l'index qui aura été créé dans la même proc. En forçant l'index (et éventuellement le plan) on peut s'affranchir de ce genre de problème.

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Requête Not exists inefficace.
    Par Arcann dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 20/09/2010, 14h03
  2. Optimisation requête NOT IN
    Par ninikkhuet dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/01/2010, 17h30
  3. Doute sur une requête NOT EXISTS
    Par CinePhil dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/03/2009, 12h00
  4. Problème requête NOT EXISTS
    Par jbulysse dans le forum SQL
    Réponses: 3
    Dernier message: 04/08/2008, 11h22
  5. [Oracle 9i] Optimisation clause not exists
    Par mjolymelot dans le forum Langage SQL
    Réponses: 7
    Dernier message: 23/08/2006, 17h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo