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

Sybase Discussion :

[ASE][T-SQL]Procédure trop longue


Sujet :

Sybase

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut [ASE][T-SQL]Procédure trop longue
    Bonjour,

    je débute dans les bases de données et encore plus sur SYBASE.

    Voici une partie de ma procédure

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    create table #LISTE_CLIENTS
    	(
    		CLI_ID 			numeric(16),
    		CLI_ORIGINE 		char(1),
    		ANNEE			int,
    		MOIS			int,
    		PGE_Q_LBL_PRODUIT	varchar(32),
    		PSU_CODE		char(4),
    		FTP_CODE		char(4),
    		FAC_CA	money,
    		FAC_VOL	numeric(30,2)
    	)
    	create index PK_MKT_LISTE_CLIENTS_id1 on #LISTE_CLIENTS (CLI_ID)
    	create index PK_MKT_LISTE_CLIENTS_id2 on #LISTE_CLIENTS (CLI_ORIGINE)
    	create index PK_MKT_EFFEC_PREC_id3 on #EFFEC_PREC (FTP_CODE)
    	create index PK_MKT_EFFEC_PREC_id4 on #EFFEC_PREC (PSU_CODE)
     
    	Insert into #LISTE_CLIENTS
    	select 
    		distinct 
    		T1.CLI_ID,
    		T1.CLI_ORIGINE,
    		T2.FAC_ANNEE,
    		T2.FAC_MOIS,
    		case when T3.PGE_Q_LBL_PRODUIT is NULL or T3.PGE_Q_LBL_PRODUIT='' then "NON IDENTIFIE" else T3.PGE_Q_LBL_PRODUIT end,
    		case when T3.PSU_CODE is NULL or T3.PSU_CODE='' then "N.I" else T3.PSU_CODE end,
    		case when T3.FTP_CODE is NULL or T3.FTP_CODE='' then "N.I" else T3.FTP_CODE end,
    		sum(T2.FAC_CA),
    		sum(T2.FAC_VOL)
    	from 
    		dm_Horus_exp.dbo.MS_CLIENT T1,
    		dm_Horus_exp.dbo.MS_FACTURE T2,
    		dm_Horus_exp.dbo.MS_PRESTATION T3,
    		dm_Horus_exp.dbo.MS_FAC_PRESTA T4
    	where
    		T3.PSU_CODE in ('THEM','GEO','CFCA','CCBK','CTIN','CSIM','CNET','CSOF','COPT','CCSC','AFFI','CPL','CPL2','FGPP') or T3.FTP_CODE in ('ADR','MAIL','GEO')	
    	                and T1.CLI_ID=T2.CLI_ID
    		and T2.FAC_NO=T4.FAC_NO
    		and T4.PGE_ID=T3.PGE_ID
    		and datepart(yy, T2.FAC_DATE)=2006
    		--and datepart(yy, T2.CTR_DATE_DISTRI_FIN)=@AnneeRef
    	group by T1.CLI_ID, T1.CLI_ORIGINE, T2.FAC_ANNEE, T2.FAC_MOIS, T3.FTP_CODE, T3.PGE_Q_LBL_PRODUIT, T3.PSU_CODE
    Ma proc marchait très bien, mais depuis que j'ai rajouté cette restriction dans le where

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T3.PSU_CODE in ('THEM','GEO','CFCA','CCBK','CTIN','CSIM','CNET','CSOF','COPT','CCSC','AFFI','CPL','CPL2','FGPP') or T3.FTP_CODE in ('ADR','MAIL','GEO')
    Elle n'en finit pas, j'ai pourtant rajouté les indexs sur PSU_CODE et FTP_CODE mais rien n'y fait.

    Quelqu'un a t'il une solution pour un débutant qui galère ?

    Merci d'avance.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 735
    Points
    52 735
    Billets dans le blog
    5
    Par défaut
    Ajouter des des index à une table temporaire locale n'a pas d'intérêt...

    Cela va ralentir notablement l'insertion.

    Que voulez vous faire avec tout ceci ???

    De plus vous faites un group by alors que je n'ai pas vu de fonction d'agrégation...

    Faites vos jointure avec des JOIN non dans la clause WHERE !
    http://sqlpro.developpez.com/cours/sqlaz/jointures/
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    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
    Le DISTINCT combiné avec le GROUP BY est suspet - il est probable que vous genèrez un produit cartesien qui est caché par le DISTINCT.

    Il faut bien s'assurer que la clause GROUP BY corresponde à tout les champs qui ne sont pas agrégé dans le SELECT, y compris les CASE...

    Pour le reste - les indexes créés sur la table temporaires ne servent évidemment à rien dans le bout de code que vous montrez, mais je suppose qu'ils ont une fonction dans une autre partie de votre traitement.

    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

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 735
    Points
    52 735
    Billets dans le blog
    5
    Par défaut
    Essayez :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    create table #LISTE_CLIENTS
       (
          CLI_ID              numeric(16),
          CLI_ORIGINE         char(1),
          ANNEE               int,
          MOIS                int,
          PGE_Q_LBL_PRODUIT   varchar(32),
          PSU_CODE            char(4),
          FTP_CODE            char(4),
          FAC_CA              money,
          FAC_VOL             numeric(30,2)
       )
     
    Insert into #LISTE_CLIENTS
     
    select distinct T1.CLI_ID, T1.CLI_ORIGINE, T2.FAC_ANNEE, T2.FAC_MOIS,
          case when T3.PGE_Q_LBL_PRODUIT is NULL or T3.PGE_Q_LBL_PRODUIT = '' then "NON IDENTIFIE" else T3.PGE_Q_LBL_PRODUIT end,
          case when T3.PSU_CODE is NULL or T3.PSU_CODE='' then "N.I" else T3.PSU_CODE end,
          case when T3.FTP_CODE is NULL or T3.FTP_CODE='' then "N.I" else T3.FTP_CODE end,
          sum(T2.FAC_CA), sum(T2.FAC_VOL)
     
    from  dm_Horus_exp.dbo.MS_CLIENT T1
             INNER JOIN dm_Horus_exp.dbo.MS_FACTURE T2
                   ON T1.CLI_ID=T2.CLI_ID
             INNER JOIN dm_Horus_exp.dbo.MS_FAC_PRESTA T4
                   ON T2.FAC_NO=T4.FAC_NO
             INNER JOIN dm_Horus_exp.dbo.MS_PRESTATION T3
                   ON T4.PGE_ID=T3.PGE_ID
     
    where (T3.PSU_CODE in ('THEM','GEO','CFCA','CCBK','CTIN','CSIM','CNET','CSOF','COPT','CCSC','AFFI','CPL','CPL2','FGPP') 
          or T3.FTP_CODE in ('ADR','MAIL','GEO'))   
          and datepart(yy, T2.FAC_DATE) = 2006
     
     
    group by T1.CLI_ID, T1.CLI_ORIGINE, T2.FAC_ANNEE, T2.FAC_MOIS, T3.FTP_CODE, T3.PGE_Q_LBL_PRODUIT, T3.PSU_CODE
     
     
    create index PK_MKT_LISTE_CLIENTS_id1 on #LISTE_CLIENTS (CLI_ID)
    create index PK_MKT_LISTE_CLIENTS_id2 on #LISTE_CLIENTS (CLI_ORIGINE)
    create index PK_MKT_EFFEC_PREC_id3 on #EFFEC_PREC (FTP_CODE)
    create index PK_MKT_EFFEC_PREC_id4 on #EFFEC_PREC (PSU_CODE)
    Votre OR ne me semble pas logique... Faîtes attention à l'ordre des prédicats dans les clauses logiques (filtre WHERE).

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Pffiou quelle rapidité. Merci

    Sinon pour le OR il peut ne pas sembler très logique, mais je n'ai pas le choix , la BDD sur laquelle je travaille est loin d'être au top.

    Merci encorE.

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    La proc passe maintenant en moins de quinze minutes.

    C'est parfait.

    Merci.

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

Discussions similaires

  1. stopper un appel à un procédure trop longue
    Par nicnoc dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/07/2010, 16h27
  2. [XL-2007] Procédure trop longue
    Par presser dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/06/2009, 18h52
  3. Une procédure trop longue
    Par lola06 dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/05/2007, 14h02
  4. [Vba access 97] Procédure trop longue
    Par saufffy dans le forum Access
    Réponses: 6
    Dernier message: 26/02/2007, 10h40
  5. [ASE] Procèdure trop longue
    Par Benjamin78 dans le forum Sybase
    Réponses: 2
    Dernier message: 11/04/2006, 10h01

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