Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 26/11/2010, 22h36   #1
Membre à l'essai
 
Inscription : novembre 2005
Messages : 122
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 122
Points : 21
Points : 21
Par défaut Optimisation de requête et index

Bonjour,
Je me retrouve avec ce genre de requête que je dois optimiser:

Code :
1
2
 
SELECT * FROM T WHERE c1 = 5448 AND c2 = 2 AND c3 IN (541784,69854,515074, ...)
le IN du c3 contient plusieurs milliers d'entrées.

Pour le moment j'ai l'index suivant:

Code :
1
2
 
CREATE INDEX IDX_T ON T (c3,c1,c2)
L'index commence par la colonne du IN donc.

Mais la requête prend encore trop de temps.

Je me demandais si il ne serait mieux de créér un index de ce genre:

Code :
1
2
 
CREATE INDEX IDX_T ON T (c1,c2,c3)
Donc en mettant la colonne du IN à la fin de l'index.
Je suis également à l'écoute d'éventuelles autres idées qui pourrait optimiser cette requête.

Je précise que je ne peux pas trop tester car je ne suis pas admin de la base.
Hypnocrate est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 23h05   #2
Membre Expert
 
Avatar de Nudger
 
Homme Thomas Arnaud
Directeur de projet
Inscription : octobre 2010
Messages : 452
Détails du profil
Informations personnelles :
Nom : Homme Thomas Arnaud
Âge : 36
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Directeur de projet
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : octobre 2010
Messages : 452
Points : 1 012
Points : 1 012
Envoyer un message via Skype™ à Nudger
De quel SGBD s'agit-il ?
L'optimisation d'un code SQL dépend beaucoup du SGBD.
Plusieurs pistes d'amélioration sont envisageable.

Par ailleurs, ne pas avoir les droits admin sur une base n'empêche pas en générale d'utiliser des tables temporaires et de les indexer.
__________________
www.nudge.org Surveillez et optimisez vos applications Java
Nudger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2010, 09h42   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 957
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 957
Points : 18 163
Points : 18 163
Envoyer un message via MSN à CinePhil
D'où provient cette liste de plusieurs milliers de nombres ?

L'idéal serait de faire une table, fut-elle temporaire, contenant en une seule colonne tous ces nombres à rechercher, d'indexer cette colonne puis de faire une jointure avec la table temporaire.

Si cette solution est impossible, dans la mesure où il y a un index sur c3, peut-être qu'en triant la liste dans l'ordre ascendant accélérerait un peu les choses.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2010, 19h12   #4
Membre à l'essai
 
Inscription : novembre 2005
Messages : 122
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 122
Points : 21
Points : 21
Citation:
De quel SGBD s'agit-il ?
Il s'agit de DB2.

Citation:
D'où provient cette liste de plusieurs milliers de nombres ?

L'idéal serait de faire une table, fut-elle temporaire, contenant en une seule colonne tous ces nombres à rechercher, d'indexer cette colonne puis de faire une jointure avec la table temporaire.

Si cette solution est impossible, dans la mesure où il y a un index sur c3, peut-être qu'en triant la liste dans l'ordre ascendant accélérerait un peu les choses.
C'est une liste renvoyée par une fonction java.
Cette fonction construit la liste à partir d'une requête SQL.
J'ai bien essayé d'injecter cette requête dans la requête principale en faisant quelque chose de ce genre:
Code :
SELECT * FROM T WHERE c1 = 5448 AND c2 = 2 AND c3 IN (SELECT id FROM T2 WHERE ...)
Mais au final c'est encore plus lent.
Je vais essayer de trier au préalable cette liste, ça me parait pas bête comme idée. Je vous tiens au courant lundi.
Hypnocrate est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2010, 19h58   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 957
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 957
Points : 18 163
Points : 18 163
Envoyer un message via MSN à CinePhil
Tu as besoin d'apprendre le SQL, et notamment les jointures !
Code :
1
2
3
4
5
SELECT * 
FROM T 
INNER JOIN T2 ON T2.id = t.c3
WHERE c1 = 5448 
  AND c2 = 2
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2010, 21h02   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 629
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 629
Points : 2 614
Points : 2 614
Sinon, pour la question initial le 2eme index devrait mieux gérer la situation.

Simplement car tu aurai une sélectivité beaucoup plus réduite pour traiter ta clause IN.

Après reste à voir ton select, car avec un "select *" DB2 pourra partir sur un scanage de table direct s'il évalue que tu vas ramener plus de 15-20% des enregistrement totale de ta table.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 10h39   #7
Membre à l'essai
 
Inscription : novembre 2005
Messages : 122
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 122
Points : 21
Points : 21
Citation:
Envoyé par CinePhil Voir le message
Tu as besoin d'apprendre le SQL, et notamment les jointures !
Code :
1
2
3
4
5
SELECT * 
FROM T 
INNER JOIN T2 ON T2.id = t.c3
WHERE c1 = 5448 
  AND c2 = 2
OK mais au final, le plan de requête est le même non?
Il va devoir passer en revue tous les c3 qui sont dans la table/liste.

Citation:
Envoyé par punkoff Voir le message
Sinon, pour la question initial le 2eme index devrait mieux gérer la situation.

Simplement car tu aurai une sélectivité beaucoup plus réduite pour traiter ta clause IN.

Après reste à voir ton select, car avec un "select *" DB2 pourra partir sur un scanage de table direct s'il évalue que tu vas ramener plus de 15-20% des enregistrement totale de ta table.
C'est aussi ce que je me suis dis. Je vais donc tenter ça. Merci.
Sinon il y a peu de chance que ca me renvoie plus de 1% de la table.
Mais je ne vois pas trop pour quelle raison il se mettrait à faire un scannage complet.
Hypnocrate est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 11h02   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 957
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 957
Points : 18 163
Points : 18 163
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Hypnocrate Voir le message
OK mais au final, le plan de requête est le même non?
Il va devoir passer en revue tous les c3 qui sont dans la table/liste.
Sauf que la jointure est l'opération la plus optimisée dans un SGBD et ce sera beaucoup plus rapide de faire en une requête et une seule transaction entre l'application et le SGBD que de faire une requête, une liste en java et une autre requête pour comparer à la liste, laquelle est longue.

Ne pas essayer de faire faire à un langage de programmation ce qui est le boulot du SGBD !

Et bien sûr, pour que la requête soit exécutée rapidement, il faut que les tables soient correctement indexées.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil 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 21h48.


 
 
 
 
Partenaires

Hébergement Web