Précédent   Forum des professionnels en informatique > Bases de données > Sybase
Sybase Forum sur la base de données Sybase. Avant de poster -> F.A.Q Sybase, Tutoriels Sybase
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/03/2006, 10h56   #1
Invité de passage
 
Inscription : mars 2006
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 12
Points : 2
Points : 2
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 :
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 :
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.
Benjamin78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2006, 11h23   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2006, 11h36   #3
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
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
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2006, 11h41   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
Essayez :

Code :
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2006, 12h03   #5
Invité de passage
 
Inscription : mars 2006
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 12
Points : 2
Points : 2
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.
Benjamin78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2006, 12h25   #6
Invité de passage
 
Inscription : mars 2006
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 12
Points : 2
Points : 2
La proc passe maintenant en moins de quinze minutes.

C'est parfait.

Merci.
Benjamin78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h04.


 
 
 
 
Partenaires

Hébergement Web