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 22/09/2004, 17h33   #1
Invité de passage
 
Inscription : septembre 2004
Messages : 3
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 3
Points : 0
Points : 0
Par défaut Delphi, Firebird, et lenteurs

Bonjour,
J'ai actuellement des petits problèmes de SQL ... hehe
Si quelqu'un savait ... ce serait cool ...

Voila :
3 bases : donnees, TableData et entreprises :


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
CREATE TABLE "DONNEES"
(
  "ID" VARCHAR(15) NOT NULL,
  "NOM" VARCHAR(150),
  "CODEPOSTAL" VARCHAR(5),
  "VILLE" VARCHAR(150),
  "ANNEE" INTEGER NOT NULL,
  "CONSOL" INTEGER DEFAULT 0 NOT NULL,
 PRIMARY KEY ("ID", "ANNEE", "CONSOL")
);
 
CREATE TABLE "ENTREPRISES"
(
  "ID" CHAR(16) NOT NULL,
  "ANNEE" NUMERIC(4, 0) NOT NULL,
 
    tout plein de valeurs (x70)
 
  "CONSOL" INTEGER DEFAULT 0 NOT NULL,
 PRIMARY KEY ("ID", "ANNEE", "CONSOL")
);
 
 
CREATE TABLE "TABLEDATA"
(
  "ID" VARCHAR(15) NOT NULL,
    "NB" NUMERIC(18, 4),
    tout plein de valeurs (x>100)
  "..."  NUMERIC(18, 4),
 
  "ANNEE" INTEGER NOT NULL,
 PRIMARY KEY ("ID", "CONSOL", "ANNEE")
);


Quand je fais ces requêtes, ca fonctionne nickel :

Code :
1
2
3
4
5
6
7
8
9
SELECT TableData.{FIELD1, FIELD2, ...}, donnees.{FIELD1, FIELD2, ...},
entreprises.{...}
FROM donnees
INNER JOIN TableData ON TableData."ID" = donnees."ID" AND TableData."CONSOL"
= donnees."CONSOL"
 LEFT JOIN entreprises ON TableData."ID" = entreprises."ID" AND
TableData."CONSOL" = entreprises."CONSOL" AND TableData."ANNEE"
=entreprises."ANNEE"
WHERE (( ( TableData."CONSOL" = '0')) AND (TableData."ANNEE"= '2002'));
Par contre, quand je fais les requêtes suivantes, cela mets trois ans :

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT TableData.{FIELD1, FIELD2, ...}, donnees.{FIELD1, FIELD2, ...},
entreprises.{...}
FROM donnees
INNER JOIN TableData ON TableData."ID" = donnees."ID" AND TableData."CONSOL"
= donnees."CONSOL"
LEFT JOIN entreprises ON TableData."ID" = entreprises."ID" AND
TableData."CONSOL" = entreprises."CONSOL" AND TableData."ANNEE"
=entreprises."ANNEE"
WHERE (( ( TableData."CONSOL" = '0') AND  ( donnees."CODEPOSTAL" LIKE '45%')
AND  ( entreprises."COL5" >= '0.2') AND ( ( TableData."NB" >= '50000000')
AND  ( TableData."NB" <= '150000000'))) AND (TableData."ANNEE"= '2002'));

Qeulqu'un aurait une solution ?
S'il vous plait !
Edité par Barbibulle : Ajout des balises [ code ] et [ /code ]
shikami est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2004, 17h50   #2
Membre confirmé
 
Avatar de TMuet
 
Homme Olivier Muet
Responsable de service informatique
Inscription : septembre 2003
Messages : 222
Détails du profil
Informations personnelles :
Nom : Homme Olivier Muet
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 222
Points : 254
Points : 254
Les champs de la clause WHERE ne possèdent pas d'index ?
Si les tables sont grosses, cela pourrait aider
TMuet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2004, 18h08   #3
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
C'est tout à fait normal.

La 1ere requete se base sur les index créés par les clés primaire.

Alors que pour la seconde requete vous l'obligez à regarder toutes les valeurs de vos tables jointes...

En plus vous utilisez le prédicat LIKE qui est un des plus gourmand en resource UC.(mais bon ce n'est pas le plus gros probleme de votre requete).

Il y a combien d'enregistrement dans chacune de vos tables ?
Et la première requete renvoie combien de lignes ?
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h31.


 
 
 
 
Partenaires

Hébergement Web