Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
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/08/2007, 14h47   #1
Membre habitué
 
Inscription : mars 2007
Messages : 210
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 210
Points : 114
Points : 114
Par défaut Amelioration de requete

J'ai une requete un peu "lourde" qui met du temps a s'executer et je voulais savoir si yavais pas un moyen de la faire autrement pour quelle soit plus rapide

Code sql :
1
2
3
4
5
SELECT * FROM GB_SUIVI WHERE 
CODEPRODUIT='SCRAP' AND SVERSION='2008' AND CODENATURE='CDIP' AND SDATE<> '01/01/0001' 
AND IDCLIENT IN
(SELECT IDCLIENT FROM GB_SUIVI WHERE 
CODEPRODUIT='SCRAP' AND SVERSION='1.0' AND CODENATURE='TELEC' AND SDATE<> '01/01/0001' )

Merci
xclam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 23h33   #2
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
et :
Code :
1
2
3
4
5
6
SELECT A.* FROM GB_SUIVI A 
INNER JOIN GB_SUIVI B ON  A.IDCLIENT=B.IDCLIENT
WHERE 
A.CODEPRODUIT='SCRAP' AND A.SVERSION='2008' AND A.CODENATURE='CDIP' AND A.SDATE<> '01/01/0001' 
AND 
B.CODEPRODUIT='SCRAP' AND B.SVERSION='1.0' AND B.CODENATURE='TELEC' AND B.SDATE<> '01/01/0001'
c'est pas mieux ?
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2007, 11h46   #3
Membre habitué
 
Homme Ludovic Lemaitre
Ingénieur développement logiciels
Inscription : mai 2006
Messages : 64
Détails du profil
Informations personnelles :
Nom : Homme Ludovic Lemaitre
Âge : 36
Localisation : France, Mayenne (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2006
Messages : 64
Points : 102
Points : 102
C'est quoi la clé primaire et les index de GB_SUIVI ?
Pergos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2007, 12h07   #4
Membre habitué
 
Inscription : mars 2007
Messages : 210
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 210
Points : 114
Points : 114
Desolé de repondre si tard mais j'ai du m'occupper d'un projet plus urgent.

Les indexes de GB_SUIVI sont CODEPRODUIT, CODENATURE, SVERSION

ID INTEGER
IDCLIENT INTEGER
CODEPRODUIT VARCHAR(12)
CODENATURE VARCHAR(5)
SVERSION VARCHAR(10)
SDATE TIMESTAMP
NOTE VARCHAR(200)

Y'a pas de clef primaire de definit.

La requete de makowski est un peu plus longue a s'executer (Statistic IBConsole)
Citation:
execution 00:00:20.0906
Starting Memory 764848
Current Memory 764660
Delta Memory -188
Number of buffer 0
Reads 8
Writes 0
contre
Citation:
execution 00:00:07.0984
Starting Memory 656180
Current Memory 714712
Delta Memory 58532
Number of buffer 0
Reads 423
Writes 1
pour la mienne.
Je sais pas trop ce que ca veux dire tous ces trucs^^
xclam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2007, 13h57   #5
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
pas clé primaire ?????
c'est la base toute table doit avoir une clé primaire

c'est quoi le plan des deux requetes ?
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2007, 14h25   #6
Membre habitué
 
Inscription : mars 2007
Messages : 210
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 210
Points : 114
Points : 114
voici les plans:

Code :
1
2
3
4
5
6
7
8
Statement: SELECT * FROM GB_SUIVI WHERE
CODEPRODUIT='SCRAP' AND SVERSION='2008' AND CODENATURE='CDIP' AND SDATE<> '01/01/0001'
AND IDCLIENT IN
(SELECT IDCLIENT FROM GB_SUIVI WHERE
CODEPRODUIT='SCRAP' AND SVERSION='1.0' AND CODENATURE='TELEC' AND SDATE<> '01/01/0001' )
 
PLAN (GB_SUIVI INDEX (IDXGBSUIVXALL))
PLAN (GB_SUIVI INDEX (IDXGBSUIVXALL))
Code :
1
2
3
4
5
6
7
8
Statement: SELECT A.* FROM GB_SUIVI A
INNER JOIN GB_SUIVI B ON  A.IDCLIENT=B.IDCLIENT
WHERE
A.CODEPRODUIT='SCRAP' AND A.SVERSION='2008' AND A.CODENATURE='CDIP' AND A.SDATE<> '01/01/0001'
AND
B.CODEPRODUIT='SCRAP' AND B.SVERSION='1.0' AND B.CODENATURE='TELEC' AND B.SDATE<> '01/01/0001'
 
PLAN JOIN (A INDEX (IDXGBSUIVXALL),B INDEX (IDXGBSUIVXALL))
Je peux avoir un ptite explication de ce que ca veux dire tout ca parceque je comprend pas trop^^

Pour ma defense c'est pas moi qui ai créé les tables et mon IBConsole bug a chaque fois que je veux faire un truc sur les tables donc j'arrive pas a mettre de clé primaire...

[edit] : je suis allé faire un tit tour dans la BD : 51 tables et seulement 16 qui ont une cle primaire
xclam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2007, 14h49   #7
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
mouais
il te faudrait un autre outil que cette vieillerie d'ibconsole (database workbench par exemple)
que tu donnes les stats des requetes
la structure des tables et index
et la version de Firebird
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2007, 15h32   #8
Membre habitué
 
Inscription : mars 2007
Messages : 210
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 210
Points : 114
Points : 114
Je crois que s'est firebird 2 qui est utilisé

Structure GB_SUIVI
Code :
1
2
3
4
5
6
7
ID INTEGER   NOT NULL    PRIMARY KEY 
IDCLIENT INTEGER
CODEPRODUIT VARCHAR(12)
CODENATURE VARCHAR(5)
SVERSION VARCHAR(10)
SDATE TIMESTAMP
NOTE VARCHAR(200)
Les indexes de GB_SUIVI :
Code :
CODEPRODUIT, CODENATURE, SVERSION
=========================================================

Code :
1
2
3
4
5
SELECT * FROM GB_SUIVI WHERE
CODEPRODUIT='SCRAP' AND SVERSION='2008' AND CODENATURE='CDIP' AND SDATE<> '01/01/0001'
AND IDCLIENT IN
(SELECT IDCLIENT FROM GB_SUIVI WHERE
CODEPRODUIT='SCRAP' AND SVERSION='1.0' AND CODENATURE='TELEC' AND SDATE<> '01/01/0001' )
Stats:
Citation:
Server Memory
Current 720,87Kb
Max 787,24Kb
Buffers 2048

Indexed 4 691 257
préparé en 0.046s, executé en 2.438s

=========================================================

Code :
1
2
3
4
5
6
SELECT A.* FROM GB_SUIVI A
INNER JOIN GB_SUIVI B ON  A.IDCLIENT=B.IDCLIENT
WHERE
A.CODEPRODUIT='SCRAP' AND A.SVERSION='2008' AND A.CODENATURE='CDIP' AND A.SDATE<> '01/01/0001'
AND
B.CODEPRODUIT='SCRAP' AND B.SVERSION='1.0' AND B.CODENATURE='TELEC' AND B.SDATE<> '01/01/0001'

Stats:
Citation:
Server Memory
Current 715,84Kb
Max 782,21Kb
Buffers 2048

Indexed 6 441 354
preparé en 0.219s, executé en 6.547sec



Voila j'espere que c'est complet^^
xclam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2007, 16h18   #9
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
et ça retourne combien de lignes ?
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2007, 16h29   #10
Membre habitué
 
Inscription : mars 2007
Messages : 210
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 210
Points : 114
Points : 114
Citation:
Envoyé par makowski Voir le message
et ça retourne combien de lignes ?
366 avec ta methode et 359 avec la mienne
ya un ptit probleme quelque part^^
xclam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2007, 17h25   #11
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
le problème c'est qu'il lit trop d'enregistements
tu peux essayer de faire un index (CODEPRODUIT, CODENATURE, SVERSION, IDCLIENT) ?

Mais avant ça, c'est quoi le but de la requête en français ?
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2007, 09h29   #12
Membre habitué
 
Inscription : mars 2007
Messages : 210
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 210
Points : 114
Points : 114
La BD contient des clients. A chaque fois qu'ils achetent ou telecharge un produit il y a un nouvel enregistrement (avec le meme idclient).

Le but de cette requete c'est de recuperer tout ceux qui ont telecharger et acheté le produit SCRAP, mais si s'etait si simple que ca...

En fait il y a une interface pour que ceux qui ne savent pas faire de requete puisse en faire.L'interface est composé de liste deroulante de la forme
Citation:
1- liste_produit liste_version liste_nature liste_date
Chaque ligne est une condition et c'est enregisrté dans une table pour pouvoir la reutilser sans la reconstruire.

Aprés pour executer la requete :
je dois recuperer les conditions dans la table et construire la requete.
xclam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2007, 10h08   #13
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
essaie aussi ça :
Code :
1
2
3
4
5
SELECT A.* FROM GB_SUIVI A WHERE
A.CODEPRODUIT='SCRAP' AND A.SVERSION='2008' AND A.CODENATURE='CDIP' AND A.SDATE<> '01/01/0001'
AND EXISTS
(SELECT B.IDCLIENT FROM GB_SUIVI B WHERE A.IDCLIENT=B.IDCLIENT AND
B.CODEPRODUIT='SCRAP' AND B.SVERSION='1.0' AND B.CODENATURE='TELEC' AND B.SDATE<> '01/01/0001' )
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2007, 10h43   #14
Membre habitué
 
Inscription : mars 2007
Messages : 210
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 210
Points : 114
Points : 114
Je viens de tester elle met 4s a s'executer et a a peu prés les meme stats que la mienne.

Par contre je sais pas si je cherche dans le bon sens parceque le gros probleme c'est pour une requete de ce type :
Code :
1
2
3
4
5
SELECT A.* FROM GB_SUIVI A WHERE
A.CODEPRODUIT='SCRAP' AND A.SVERSION='1.0' AND A.CODENATURE='TELEC' AND A.SDATE<> '01/01/0001'
AND NOT EXISTS
(SELECT B.IDCLIENT FROM GB_SUIVI B WHERE A.IDCLIENT=B.IDCLIENT AND
B.CODEPRODUIT='GENEA' AND B.CODENATURE='CDIP' AND B.SDATE<> '01/01/0001' )
(->not)

Je me suis dit quand ameliorant la simple sa ameliorerai celle-ci aussi (ce qui doit etre le cas) mais il serait peut etre plus judicieux que je me concentre sur cette derniere? Je l'ai executer :

Préparé en 0.031s executé en 43.922s
stats:
Citation:
Server Memory
Current 729,37Kb
Max 828,16Kb
Buffers 2048

Indexed 32 750 231
C'est un peu mieux que ce que je faisait et la y'en a que deux mais il peux en avoir plus...
xclam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2007, 11h27   #15
Membre habitué
 
Inscription : mars 2007
Messages : 210
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 210
Points : 114
Points : 114
L'ordre des index est important?
j'ai modifié mon index comme ceci :
Code :
IDCLIENT, CODEPRODUIT, CODENATURE
et ca va beaucoup plus vite.

En fait le probleme c'etait la base et pas les requetes^^

Merci beaucoup pour ton aide makowski
xclam 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 14h12.


 
 
 
 
Partenaires

Hébergement Web