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 20/02/2006, 17h21   #1
Membre confirmé
 
Avatar de touhami
 
Inscription : avril 2002
Messages : 327
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 327
Points : 209
Points : 209
Par défaut Exécution tres Long d'une requête de Selection

Bonjour a tous,
Je possède deux Tables
Une table maître Des Ventes
Structure de la Table Maitre
Code :
1
2
3
  NumeroBon  Integer PRIMARY KEY
    DateBon Date
    Code_Client Varchar(6)
Et la table détail des ventes

Structure de la Table Detail
Code :
1
2
3
4
5
6
    NumeroBon  Integer 
    Code_Produit Varchar(10)
    Qte_Vendu Numeric(15,2)
    Pu_Vente Numeric(15,2)
    Benifice Numeric(15,2)  
La clé primaire est (NumeroBon + CodeProduit)
Nombre d'enregistrement de la Table Maitre : 12308
Nombre d'enregistrement de la Table Detail : 91122


J'ai Bien Ajouter un index secondaire a ma Table Detail sur le champ Benifice

Mon but est d’avoir le benifice total dans la période allant du 01/01/2000 et 01/01/2006

Code :
1
2
3
4
5
SELECT  Sum(d1.Benifice)
FROM Detail  D1 ,  Maitre d
WHERE
   (D1.NumeroBon = D.NumeroBon)
    AND (D.DateBon BETWEEN '01/01/2000' AND '01/01/2006')
L'exécution de la requête est Très Long et voici les Détails afficher dans ma Console

Plan
Citation:
Statement: SELECT Sum(d1.Benifice)
FROM Detail D1 , Maitre d
WHERE
(D1.NumeroBon = D.NumeroBon)
and (D.DateBon Between '01/01/2000' and '01/01/2006')
PLAN JOIN (D1 NATURAL,D INDEX (RDB$PRIMARY17,LADATEBON))

Statistique

Citation:
Exécution 00:02:19.0109
J'utilise Interbase 7.5 sous Windows XP.
touhami est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2006, 19h18   #2
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
As-tu un index sur DateBon ?
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2006, 08h33   #3
Membre confirmé
 
Avatar de touhami
 
Inscription : avril 2002
Messages : 327
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 327
Points : 209
Points : 209
Bonjour,
et merci pour votre reponse,
Oui il y a un index sur la dateBon,
et c'est bien préciser dans le plan utiliser par Interbase

Citation:
PLAN JOIN (D1 NATURAL,D INDEX (RDB$PRIMARY17,LADATEBON))
touhami est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2006, 09h55   #4
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 587
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 587
Points : 730
Points : 730
Salut,


Au lieu de faire ta jointure dans ta clause WHERE, essaie en faisant :

Code :
... FROM Detail D1 JOIN Maitre D ON D1.NumeroBon = D.NumeroBon...
Ca devrait améliorer les perfs.

@+
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2006, 00h04   #5
Membre éprouvé
 
Avatar de JustMe
 
Inscription : juillet 2002
Messages : 432
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 432
Points : 441
Points : 441
je de l'avis de SLE essais plutot la requete :
Code :
1
2
3
4
SELECT  Sum(d1.Benifice)
FROM Detail  D1 JOIN  Maitre d
ON D1.NumeroBon = D.NumeroBon
WHERE (D.DateBon >= '01/01/2000') AND (D.DateBon <= '01/01/2006')
et tu nous informe du temps d'execution
__________________
<On fait la science avec des faits, comme on fait une maison avec des pierres : mais une accumulation de faits n'est pas plus une science qu'un tas de pierres n'est une maison> **Poincaré**
http://www.mobile-tactile.com/
JustMe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2006, 10h07   #6
Membre confirmé
 
Avatar de touhami
 
Inscription : avril 2002
Messages : 327
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 327
Points : 209
Points : 209
Bonjour,
j'ai essayé l'avis de SLE :
Code :
1
2
3
4
SELECT  Sum(d1.Benifice) 
FROM Detail  D1 JOIN  Maitre d 
ON D1.NumeroBon = D.NumeroBon 
WHERE (D.DateBon >= '01/01/2000') AND (D.DateBon <= '01/01/2006')
mais seulement j'ai ganigner 2 secondes:
00:02:17,
meme j'ai essayé avec cette requete :

Code :
1
2
3
4
5
SELECT  Sum(d1.Benifice) 
FROM Detail  D1 JOIN  Maitre d 
ON D1.NumeroBon = D.NumeroBon 
WHERE (D.DateBon >= '01/01/2000') AND (D.DateBon <= '01/01/2006') 
PLAN JOIN (D1 NATURAL,D INDEX (RDB$PRIMARY17,LADATEBON)
mais pas de gros changement.
Merci pour vos reponses.
touhami est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2006, 10h33   #7
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 587
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 587
Points : 730
Points : 730
Et en faisant ceci, qu'est-ce que ça donne comme temps d'execution ?

Code :
1
2
3
SELECT  Sum(Benifice) 
FROM Detail
WHERE NumeroBon IN (SELECT NumeroBon FROM Maitre WHERE DateBon BETWEEN '01/01/2000' AND '01/01/2006')
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 09h15   #8
Membre à l'essai
 
Inscription : avril 2003
Messages : 123
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 123
Points : 24
Points : 24
Au regard de ton plan d'exécution de la requête (créer automatiquement par IB), lB n'utilise pas comme premier critère un index. Contourne le problème toi-même en créant le PLAN. Il suffit d'ajouter PLAN (...) à la fin de la requête où tu commences ton plan par tes index primaires.
Il faut savoir que IB est très performant sur les insert et les update, mais qu'en select il lui arrive de se planter complètement.
__________________
Température de l'eau : 28 °
Température extérieure : 32°
Température au fond du verre : 50° ~ 55°
------ Mangez des bananes ----------
bidson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 11h20   #9
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Bonjour,

Je viens de faire les tests en créant ces deux tables et en les remplissants avec le meme volume de donnée. Et votre requete ne prend que 64ms.

Ce qui est étonnant dans votre résultat et c'est ce qui met ennormément de temps : c'est D1 NATURAL celà veut tout simplement dire qu'il n'utilise pas la clé primaire ni d'index pour la table Detail. Ce qui est tres ennuyeux. Car pour chaque enregistrement maitre il va scruter toute votre table detail pour trouver ceux qui correspondent...

Verifiez que vous avez bien un index ou clé primaire sur le champ numerobon de votre table detail. (Si c'est le cas supprimez l index en question et recréez le.)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE MAITRE (
    NUMEROBON    INTEGER NOT NULL,
    DATEBON      DATE,
    CODE_CLIENT  VARCHAR(6)
);
 
ALTER TABLE MAITRE ADD CONSTRAINT PK_MAITRE PRIMARY KEY (NUMEROBON);
 
CREATE INDEX MAITRE_IDX1 ON MAITRE (DATEBON);
 
CREATE TABLE DETAIL (
    NUMEROBON     INTEGER NOT NULL,
    CODE_PRODUIT  VARCHAR(10) NOT NULL,
    QTE_VENDU     NUMERIC(15,2),
    PU_VENTE      NUMERIC(15,2),
    BENEFICE      NUMERIC(15,2)
);
 
ALTER TABLE DETAIL ADD CONSTRAINT PK_DETAIL PRIMARY KEY (NUMEROBON, CODE_PRODUIT);
la requete :
Code :
1
2
3
SELECT  Sum(d1.benefice), count(*)
FROM Detail  D1 INNER JOIN Maitre d ON d.numerobon=d1.numerobon
WHERE D.DateBon BETWEEN '2000/01/01' AND '2006/01/01'
Le plan utilisé :
Code :
PLAN JOIN (D INDEX (MAITRE_IDX1),D1 INDEX (PK_DETAIL))
Maitre_IDX1 étant l index sur dateBon.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 17h10   #10
Membre confirmé
 
Avatar de touhami
 
Inscription : avril 2002
Messages : 327
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 327
Points : 209
Points : 209
Bonjour,
Merci Barbibulle , et je vais tester cela ce soir.
touhami est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2006, 09h34   #11
Membre confirmé
 
Avatar de touhami
 
Inscription : avril 2002
Messages : 327
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 327
Points : 209
Points : 209
Bonjour,
j'ai suivie les etapes du Barbibulle , et ça marche tres bien.
Merci a tous.
touhami 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 10h12.


 
 
 
 
Partenaires

Hébergement Web