OVH Cloud OVH Cloud

Nombres de champs indexés et performances

4 réponses
Avatar
Eric
Bonjour,

Je me pose une question par concernant les performances d'une recherche par
rapport aux index.

Je m'explique, vaux t'il mieux avoir (en terme de performance) :

Une table avec 4 index sur des champs [int] (des sous catégories de sous
sous catégorie ......) qui contiennent une valeur unique (pour l'ensemble de
la base) et effectuer ce type de requette :

SELECT * FROM TbProduit (INDEX = IX_TbProduit)
WHERE IDCat1 = @IDCat1 AND IDCat2 = @IDCat2 AND IDCat3 = @IDCat3 AND
IDCat4 = @IDCat4

Donc dans le cas ci-dessus un index (IX_TbProduit) effectué sur les 4 champs

Ou alors :

Une table qui contient 2 index [int] (une sous catégories et une sous sous
catégorie ) qui contiennent une valeur unique (pour l'ensemble de la base)
et effectuer ce type de requette :

SELECT * FROM TbProduit (INDEX = IX_TbProduit)
WHERE IDCat3 = @IDCat3 AND IDCat4 = @IDCat4

Donc dans le cas ci-dessus un index (IX_TbProduit) effectué sur les 2 champs
les deux autres étant présent dans la table mais oubliés pour la requette de
recherche

En sachant que la table peut contenir plusieurs centaines de milliers de
lignes et que le souci principale est la performance de la recherche.

Merci pour vos réponses

4 réponses

Avatar
Med Bouchenafa[MVP]
Quatre index distincts, un sur chacune des colonnes référencées dans la clause WHERE.
L'optimiseur va alors utiliser les quatre index en même temps.
Si les données sont effectivement uniques, ne pas oublier de créer des index UNIQUE.
Cela aidera l'optimiseur. Par contre, il est inutile de rajouter la clause (INDEX = IX_TbProduit)

SELECT * FROM TbProduit
WHERE IDCat1 = @IDCat1
AND IDCat2 = @IDCat2
AND IDCat3 = @IDCat3
AND IDCat4 = @IDCat4


--
Bien cordialement
Med Bouchenafa
TETRASET
75015 Paris
"Eric" a écrit dans le message de news: c03f87$gu8$
Bonjour,

Je me pose une question par concernant les performances d'une recherche par
rapport aux index.

Je m'explique, vaux t'il mieux avoir (en terme de performance) :

Une table avec 4 index sur des champs [int] (des sous catégories de sous
sous catégorie ......) qui contiennent une valeur unique (pour l'ensemble de
la base) et effectuer ce type de requette :

SELECT * FROM TbProduit (INDEX = IX_TbProduit)
WHERE IDCat1 = @IDCat1 AND IDCat2 = @IDCat2 AND IDCat3 = @IDCat3 AND
IDCat4 = @IDCat4

Donc dans le cas ci-dessus un index (IX_TbProduit) effectué sur les 4 champs

Ou alors :

Une table qui contient 2 index [int] (une sous catégories et une sous sous
catégorie ) qui contiennent une valeur unique (pour l'ensemble de la base)
et effectuer ce type de requette :

SELECT * FROM TbProduit (INDEX = IX_TbProduit)
WHERE IDCat3 = @IDCat3 AND IDCat4 = @IDCat4

Donc dans le cas ci-dessus un index (IX_TbProduit) effectué sur les 2 champs
les deux autres étant présent dans la table mais oubliés pour la requette de
recherche

En sachant que la table peut contenir plusieurs centaines de milliers de
lignes et que le souci principale est la performance de la recherche.

Merci pour vos réponses





Avatar
Eric
Merci pour cette réponse, une question encore :

Si je veux faire un trie sur différent index en vu d'afficher une liste
triée, je fait donc plusieurs index triés différamment et donc pour pour
indiquer quel index doit utiliser la requette suivant le trie voulu je
présise quel index doit être utilisé en ajoutant (INDEX = IX_TbProduitASC)
ou (INDEX = IX_TbProduitDESC).

Correct ?




"Med Bouchenafa[MVP]" a écrit dans le message de
news:
Quatre index distincts, un sur chacune des colonnes référencées dans la


clause WHERE.
L'optimiseur va alors utiliser les quatre index en même temps.
Si les données sont effectivement uniques, ne pas oublier de créer des


index UNIQUE.
Cela aidera l'optimiseur. Par contre, il est inutile de rajouter la clause


(INDEX = IX_TbProduit)

SELECT * FROM TbProduit
WHERE IDCat1 = @IDCat1
AND IDCat2 = @IDCat2
AND IDCat3 = @IDCat3
AND IDCat4 = @IDCat4


--
Bien cordialement
Med Bouchenafa
TETRASET
75015 Paris
"Eric" a écrit dans le message de news:


c03f87$gu8$
> Bonjour,
>
> Je me pose une question par concernant les performances d'une recherche


par
> rapport aux index.
>
> Je m'explique, vaux t'il mieux avoir (en terme de performance) :
>
> Une table avec 4 index sur des champs [int] (des sous catégories de sous
> sous catégorie ......) qui contiennent une valeur unique (pour


l'ensemble de
> la base) et effectuer ce type de requette :
>
> SELECT * FROM TbProduit (INDEX = IX_TbProduit)
> WHERE IDCat1 = @IDCat1 AND IDCat2 = @IDCat2 AND IDCat3 = @IDCat3 AND
> IDCat4 = @IDCat4
>
> Donc dans le cas ci-dessus un index (IX_TbProduit) effectué sur les 4


champs
>
> Ou alors :
>
> Une table qui contient 2 index [int] (une sous catégories et une sous


sous
> catégorie ) qui contiennent une valeur unique (pour l'ensemble de la


base)
> et effectuer ce type de requette :
>
> SELECT * FROM TbProduit (INDEX = IX_TbProduit)
> WHERE IDCat3 = @IDCat3 AND IDCat4 = @IDCat4
>
> Donc dans le cas ci-dessus un index (IX_TbProduit) effectué sur les 2


champs
> les deux autres étant présent dans la table mais oubliés pour la


requette de
> recherche
>
> En sachant que la table peut contenir plusieurs centaines de milliers de
> lignes et que le souci principale est la performance de la recherche.
>
> Merci pour vos réponses
>
>
>




Avatar
Med Bouchenafa[MVP]
Pourquoi ne pas faire confiance à l'optimiseur ?
C'est rare d'obtenir un résultat contraire aux attentes.
Peux-tu préciser plus ce que tu comptes faire ?


--
Bien cordialement
Med Bouchenafa
TETRASET
75015 Paris
"Eric" wrote in message
news:c05iuc$5ie$
Merci pour cette réponse, une question encore :

Si je veux faire un trie sur différent index en vu d'afficher une liste
triée, je fait donc plusieurs index triés différamment et donc pour pour
indiquer quel index doit utiliser la requette suivant le trie voulu je
présise quel index doit être utilisé en ajoutant (INDEX = IX_TbProduitASC)
ou (INDEX = IX_TbProduitDESC).

Correct ?




"Med Bouchenafa[MVP]" a écrit dans le message de
news:
> Quatre index distincts, un sur chacune des colonnes référencées dans la
clause WHERE.
> L'optimiseur va alors utiliser les quatre index en même temps.
> Si les données sont effectivement uniques, ne pas oublier de créer des
index UNIQUE.
> Cela aidera l'optimiseur. Par contre, il est inutile de rajouter la


clause
(INDEX = IX_TbProduit)
>
> SELECT * FROM TbProduit
> WHERE IDCat1 = @IDCat1
> AND IDCat2 = @IDCat2
> AND IDCat3 = @IDCat3
> AND IDCat4 = @IDCat4
>
>
> --
> Bien cordialement
> Med Bouchenafa
> TETRASET
> 75015 Paris
> "Eric" a écrit dans le message de news:
c03f87$gu8$
> > Bonjour,
> >
> > Je me pose une question par concernant les performances d'une


recherche
par
> > rapport aux index.
> >
> > Je m'explique, vaux t'il mieux avoir (en terme de performance) :
> >
> > Une table avec 4 index sur des champs [int] (des sous catégories de


sous
> > sous catégorie ......) qui contiennent une valeur unique (pour
l'ensemble de
> > la base) et effectuer ce type de requette :
> >
> > SELECT * FROM TbProduit (INDEX = IX_TbProduit)
> > WHERE IDCat1 = @IDCat1 AND IDCat2 = @IDCat2 AND IDCat3 = @IDCat3 AND
> > IDCat4 = @IDCat4
> >
> > Donc dans le cas ci-dessus un index (IX_TbProduit) effectué sur les 4
champs
> >
> > Ou alors :
> >
> > Une table qui contient 2 index [int] (une sous catégories et une sous
sous
> > catégorie ) qui contiennent une valeur unique (pour l'ensemble de la
base)
> > et effectuer ce type de requette :
> >
> > SELECT * FROM TbProduit (INDEX = IX_TbProduit)
> > WHERE IDCat3 = @IDCat3 AND IDCat4 = @IDCat4
> >
> > Donc dans le cas ci-dessus un index (IX_TbProduit) effectué sur les 2
champs
> > les deux autres étant présent dans la table mais oubliés pour la
requette de
> > recherche
> >
> > En sachant que la table peut contenir plusieurs centaines de milliers


de
> > lignes et que le souci principale est la performance de la recherche.
> >
> > Merci pour vos réponses
> >
> >
> >
>
>




Avatar
Fred BROUARD
Non, un index n'est pas un tri !!!

Un index est une structure de données optimisé pour effectuer des
recherches.

Le tri est une opération qui n'a rien à voir avec les index.
En revanche si des index existent sur toutes les colonnes résultantes
qui doivent être triées pour la réponse, l'effort de la procédure de tri
sera minime parce que les données ont toutes les chances d'êtres
traitées dans l'ordre...

Le sens de l'ordre ne change pas grand chose compte tenu qu'il s'agit
d'une permutation à simple passe entre ASC et DESC.

A +

Eric a écrit:
Merci pour cette réponse, une question encore :

Si je veux faire un trie sur différent index en vu d'afficher une liste
triée, je fait donc plusieurs index triés différamment et donc pour pour
indiquer quel index doit utiliser la requette suivant le trie voulu je
présise quel index doit être utilisé en ajoutant (INDEX = IX_TbProduitASC)
ou (INDEX = IX_TbProduitDESC).

Correct ?




"Med Bouchenafa[MVP]" a écrit dans le message de
news:

Quatre index distincts, un sur chacune des colonnes référencées dans la



clause WHERE.

L'optimiseur va alors utiliser les quatre index en même temps.
Si les données sont effectivement uniques, ne pas oublier de créer des



index UNIQUE.

Cela aidera l'optimiseur. Par contre, il est inutile de rajouter la clause



(INDEX = IX_TbProduit)

SELECT * FROM TbProduit
WHERE IDCat1 = @IDCat1
AND IDCat2 = @IDCat2
AND IDCat3 = @IDCat3
AND IDCat4 = @IDCat4


--
Bien cordialement
Med Bouchenafa
TETRASET
75015 Paris
"Eric" a écrit dans le message de news:



c03f87$gu8$

Bonjour,

Je me pose une question par concernant les performances d'une recherche





par

rapport aux index.

Je m'explique, vaux t'il mieux avoir (en terme de performance) :

Une table avec 4 index sur des champs [int] (des sous catégories de sous
sous catégorie ......) qui contiennent une valeur unique (pour





l'ensemble de

la base) et effectuer ce type de requette :

SELECT * FROM TbProduit (INDEX = IX_TbProduit)
WHERE IDCat1 = @IDCat1 AND IDCat2 = @IDCat2 AND IDCat3 = @IDCat3 AND
IDCat4 = @IDCat4

Donc dans le cas ci-dessus un index (IX_TbProduit) effectué sur les 4





champs

Ou alors :

Une table qui contient 2 index [int] (une sous catégories et une sous





sous

catégorie ) qui contiennent une valeur unique (pour l'ensemble de la





base)

et effectuer ce type de requette :

SELECT * FROM TbProduit (INDEX = IX_TbProduit)
WHERE IDCat3 = @IDCat3 AND IDCat4 = @IDCat4

Donc dans le cas ci-dessus un index (IX_TbProduit) effectué sur les 2





champs

les deux autres étant présent dans la table mais oubliés pour la





requette de

recherche

En sachant que la table peut contenir plusieurs centaines de milliers de
lignes et que le souci principale est la performance de la recherche.

Merci pour vos réponses














--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************