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 25/06/2011, 14h01   #1
Inscrit
 
Inscription : mai 2004
Messages : 758
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 758
Points : 287
Points : 287
Par défaut Optimisation de base ou de requete

bonjour a tous
voici la requete que j'utilise pour reperer les doublons de ma base :
Code :
1
2
3
4
5
6
7
8
9
 
SELECT DISTINCT *
FROM   MESINFORMATIONS T1
WHERE  EXISTS (SELECT *
               FROM   MESINFORMATIONS T2
               WHERE  T1.lacle <> T2.lacle
                 AND  T1.champ1 = T2.champ1
                 AND  T1.champ2 = T2.champ2
                 AND  T1.champ3 = T2.champ3)
champ1, champ2, champ3 sont des varchar(80), et ma table a 40163 lignes et 20 colone ,
mon soucis c'est que quand je lance la requete ma machine qui a 1go de ram semble ne plus marcher, j'ai attendu plus de 45 min et la j'ai tout arreté.

es qu'il faut que je crée des index sur champ1, champ2, champ3 ?
ou c'est la taille des donnée qui pose problème ?
Merci pour vos éclairage

PS : je suis sous FB 2.5 j'ai aussi fait un back restore sur la base.
devalender est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2011, 14h34   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Ta requête semble correct

Non, ta base de données est toute petite
Oui tous les éléments inclus dans les clauses WHERE doivent être indexés

Remplaces le * par les colonnes à afficher (Pas dans la clause EXISTS, là tu peux mettre 1 -éventuellement-).


Test l’exécution de la requête de la clause existe (avec et sans index)


jettes un petit coup d'œil à la FAQ, au cas où cela te suffise

ou même plutôt cela qui serait sans doute plus rapide.


Petit rajout : et pourquoi pas ne pas ajouter des contraintes d'unicité sur tes colonnes, cela éviterait de générer des doublons
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2011, 15h16   #3
Inscrit
 
Inscription : mai 2004
Messages : 758
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 758
Points : 287
Points : 287
effectivement dans la faq ce code passe propre :

Code :
1
2
3
4
5
 
SELECT champ1, champ2, champ3 , count(*)
FROM t1
GROUP BY champ1, champ2, champ3 
HAVING count(*) > 1;
moins de 1s
Ensuite pour ce code :
Code :
1
2
3
4
5
6
7
 
DELETE FROM MESINFORMATIONS T1
WHERE EXISTS (
SELECT 1 FROM MESINFORMATIONS T2 
WHERE t1.champ1 = t2.champ1 AND t1.champ2 = t2.champ2 
AND t1.champ3=t2.champ3
  AND t2.RDB$DB_KEY > t1.RDB$DB_KEY );
ici aussi ça ram grave !
je pense que vais commencer par indexer mes champs et ensuite relancer les requetes

Question de comprehension es que la 2eme reqête supprime exactement ce definit dans la première ?

merci
devalender est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2011, 16h27   #4
Inscrit
 
Inscription : mai 2004
Messages : 758
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 758
Points : 287
Points : 287
En créant un index pour chacun de mes champs je viens resoudre le problème de lenteur merci beaucoup !

mais j'ai encore un autre soucis c'est au niveau de la comprehension de ces deux requête, dont voici les codes
en faite je recherche des doublons (sur le champ1, champ2 et champ3)

Requête 1
Code :
1
2
3
4
5
6
7
8
9
 
SELECT DISTINCT *
FROM   MESINFORMATIONS T1
WHERE  EXISTS (SELECT *
               FROM   MESINFORMATIONS T2
               WHERE  T1.lacle <> T2.lacle
                 AND  T1.champ1 = T2.champ1
                 AND  T1.champ2 = T2.champ2
                 AND  T1.champ3 = T2.champ3)
Resultat : 2977


Requête 2
Code :
1
2
3
4
5
 
SELECT champ1, champ2, champ3, count(*)
FROM MESINFORMATIONS
GROUP BY champ1, champ2, champ3
HAVING count(*) > 1;

Resultat : 1481

la je suis tout confu ! j'ai vraiment besion d'aide la !
merci
devalender est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2011, 18h28   #5
Inscrit
 
Inscription : mai 2004
Messages : 758
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 758
Points : 287
Points : 287
Après des test je pense avoir compris lorsque j'ai mis mes champs dans la close select je me suis retrouver avec les mêmes resultats pour les deux requêtes mais quand je laisse * la c'est differents.
Bon dans tous les cas je suis toujours ouvert a d'autres explications.
Merci a tous
devalender 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 02h49.


 
 
 
 
Partenaires

Hébergement Web