OVH Cloud OVH Cloud

Explication sur INDEX(index, index, ...)

9 réponses
Avatar
Thierry
Bonjour,

quelqu'un peut-il m'expliquer comment utiliser une requête du style:
SELECT toto FROM table (INDEX(indexA, indexB, ...))

Merci,
Thierry

9 réponses

Avatar
Patrice
Je ne comprends pas trop le sens de la question. C'est une requête SELECT
qui s'utilise comme toute autre requête SELECT pour retourner un jeu
d'enregistrements ?

Où as tu une question sur la clause INDEX dont l'utilisation devrait sans
doute être très très exceptionnelle...

--

"Thierry" a écrit dans le message de
news:439db55d$0$20145$
Bonjour,

quelqu'un peut-il m'expliquer comment utiliser une requête du style:
SELECT toto FROM table (INDEX(indexA, indexB, ...))

Merci,
Thierry




Avatar
Thierry
en fait, j'ai de gros problèmes de performance chez un client.

J'ai lancé le Performance Monitor avec le compteur "Recherche
d'index/secondes" et il prend des valeurs importantes : 200.000 - 280.000
J'essaie donc de vérifier mes index et je suis tombé sur cette syntaxe que
je ne connaissais pas. Je souhaitais donc en savoir plus sur comment la
manière de créer des index 'compatibles' avec cet écriture.

En postant sur microsoft.public.sqlserver.programming, les réponses sont que
je ne devrais utiliser cette syntaxe qu'en dernier recours.

Voilà donc ma préoccupation. Par ailleurs, si qqu'un avait une idée pour
avoir des valeurs aussi importantes dans le Performance Monitor ....


"Patrice" a écrit dans le message de news:
eRAmvI8$
Je ne comprends pas trop le sens de la question. C'est une requête SELECT
qui s'utilise comme toute autre requête SELECT pour retourner un jeu
d'enregistrements ?

Où as tu une question sur la clause INDEX dont l'utilisation devrait sans
doute être très très exceptionnelle...

--

"Thierry" a écrit dans le message de
news:439db55d$0$20145$
Bonjour,

quelqu'un peut-il m'expliquer comment utiliser une requête du style:
SELECT toto FROM table (INDEX(indexA, indexB, ...))

Merci,
Thierry








Avatar
Med Bouchenafa
La syntaxe recommandée est
SELECT toto FROM table WITH ( INDEX(Index1,Index2, Index3) )
Je crois me souvenir que le WITH est obligatoire maintenant dans 2005

Pour ce qui est de l'explication, je ne vois rien de spécial par rapport à
ce que dit l'Aide En Ligne
Si l'on prend l'exemple de la table Customers dans la base Northwind et que
l'on regarde les plans de requête de

1) SELECT * FROM Customers

2) SELECT * FROM Customers
WITH(INDEX(City ))

3)SELECT * FROM Customers
WITH(INDEX(City, CompanyName))

4)SELECT * FROM Customers
WITH(INDEX(City, CompanyName,PostalCode, Region ))

A chaque fois SQL Server utilise tous les index spécifiés
A moins que tu veux dire autre chose

--
Bien cordialement
Med Bouchenafa

"Thierry" wrote in message
news:439db55d$0$20145$
Bonjour,

quelqu'un peut-il m'expliquer comment utiliser une requête du style:
SELECT toto FROM table (INDEX(indexA, indexB, ...))

Merci,
Thierry



Avatar
Patrice
Ok voir la clause FROM dans la doc. Cela permet de "forcer" l'utilisation
d'un index particulier alors que SQL Server sélectionne normalement l'index
approprié à la situation.

Pas d'idée pour le compteur. C'est un SELECT sur toute une table qui semble
poser problème ?

--
Patrice

"Thierry" a écrit dans le message de
news:439e8e02$0$21296$
en fait, j'ai de gros problèmes de performance chez un client.

J'ai lancé le Performance Monitor avec le compteur "Recherche
d'index/secondes" et il prend des valeurs importantes : 200.000 - 280.000
J'essaie donc de vérifier mes index et je suis tombé sur cette syntaxe que
je ne connaissais pas. Je souhaitais donc en savoir plus sur comment la
manière de créer des index 'compatibles' avec cet écriture.

En postant sur microsoft.public.sqlserver.programming, les réponses sont


que
je ne devrais utiliser cette syntaxe qu'en dernier recours.

Voilà donc ma préoccupation. Par ailleurs, si qqu'un avait une idée pour
avoir des valeurs aussi importantes dans le Performance Monitor ....


"Patrice" a écrit dans le message de news:
eRAmvI8$
> Je ne comprends pas trop le sens de la question. C'est une requête


SELECT
> qui s'utilise comme toute autre requête SELECT pour retourner un jeu
> d'enregistrements ?
>
> Où as tu une question sur la clause INDEX dont l'utilisation devrait


sans
> doute être très très exceptionnelle...
>
> --
>
> "Thierry" a écrit dans le message de
> news:439db55d$0$20145$
>> Bonjour,
>>
>> quelqu'un peut-il m'expliquer comment utiliser une requête du style:
>> SELECT toto FROM table (INDEX(indexA, indexB, ...))
>>
>> Merci,
>> Thierry
>>
>>
>
>




Avatar
Thierry
j'utilise le plan d'éxécution pour vérifier que SQL me propose le bon index.

Concernant le compteur, comme c'est une application de gestion d'entrepôt,
il y a quelques dizaines d'utilisateurs simultanées sur plusieurs tables.
Difficile donc de savoir sur quelle(s) table(s) se trouve le problème.


"Patrice" a écrit dans le message de news:
OdJPkk8$
Ok voir la clause FROM dans la doc. Cela permet de "forcer" l'utilisation
d'un index particulier alors que SQL Server sélectionne normalement
l'index
approprié à la situation.

Pas d'idée pour le compteur. C'est un SELECT sur toute une table qui
semble
poser problème ?

--
Patrice

"Thierry" a écrit dans le message de
news:439e8e02$0$21296$
en fait, j'ai de gros problèmes de performance chez un client.

J'ai lancé le Performance Monitor avec le compteur "Recherche
d'index/secondes" et il prend des valeurs importantes : 200.000 - 280.000
J'essaie donc de vérifier mes index et je suis tombé sur cette syntaxe
que
je ne connaissais pas. Je souhaitais donc en savoir plus sur comment la
manière de créer des index 'compatibles' avec cet écriture.

En postant sur microsoft.public.sqlserver.programming, les réponses sont


que
je ne devrais utiliser cette syntaxe qu'en dernier recours.

Voilà donc ma préoccupation. Par ailleurs, si qqu'un avait une idée pour
avoir des valeurs aussi importantes dans le Performance Monitor ....


"Patrice" a écrit dans le message de news:
eRAmvI8$
> Je ne comprends pas trop le sens de la question. C'est une requête


SELECT
> qui s'utilise comme toute autre requête SELECT pour retourner un jeu
> d'enregistrements ?
>
> Où as tu une question sur la clause INDEX dont l'utilisation devrait


sans
> doute être très très exceptionnelle...
>
> --
>
> "Thierry" a écrit dans le message de
> news:439db55d$0$20145$
>> Bonjour,
>>
>> quelqu'un peut-il m'expliquer comment utiliser une requête du style:
>> SELECT toto FROM table (INDEX(indexA, indexB, ...))
>>
>> Merci,
>> Thierry
>>
>>
>
>








Avatar
Thierry
je cherchais surtout des infos sur la manière de créer correctement les
index.

Par exemple, j'ai une table contenant:
- code société
- n° de commande (par société)
- code article (par société)
- date

est-il judicieux de créer:
- index1 sur 'Code société' & 'n° de commande'
- index2 sur 'Code société' & 'Code article'

et utiliser les 2 index lorsque je fais des requêtes sur le n° de commande
ET le code article pour une même société ?


"Med Bouchenafa" a écrit dans le message de news:
%23v6%23ia8$
La syntaxe recommandée est
SELECT toto FROM table WITH ( INDEX(Index1,Index2, Index3) )
Je crois me souvenir que le WITH est obligatoire maintenant dans 2005

Pour ce qui est de l'explication, je ne vois rien de spécial par rapport à
ce que dit l'Aide En Ligne
Si l'on prend l'exemple de la table Customers dans la base Northwind et
que l'on regarde les plans de requête de

1) SELECT * FROM Customers

2) SELECT * FROM Customers
WITH(INDEX(City ))

3)SELECT * FROM Customers
WITH(INDEX(City, CompanyName))

4)SELECT * FROM Customers
WITH(INDEX(City, CompanyName,PostalCode, Region ))

A chaque fois SQL Server utilise tous les index spécifiés
A moins que tu veux dire autre chose

--
Bien cordialement
Med Bouchenafa

"Thierry" wrote in message
news:439db55d$0$20145$
Bonjour,

quelqu'un peut-il m'expliquer comment utiliser une requête du style:
SELECT toto FROM table (INDEX(indexA, indexB, ...))

Merci,
Thierry







Avatar
Med Bouchenafa
Seul toi qui a une connaissance de ton application peut choisir le bon plan
d'indexage.
Tu peux toujours t'inspirer de ce que te propose l'Assistant Création
d'index
Dans le cas tu cites, si tu as un index sur 'n° de commande' et un autre sur
'Code article', SQL Server est capable d'utiliser les deux index en même
temps s'il le juge nécessaire
--
Bien cordialement
Med Bouchenafa

"Thierry" wrote in message
news:439ead0e$0$18341$
je cherchais surtout des infos sur la manière de créer correctement les
index.

Par exemple, j'ai une table contenant:
- code société
- n° de commande (par société)
- code article (par société)
- date

est-il judicieux de créer:
- index1 sur 'Code société' & 'n° de commande'
- index2 sur 'Code société' & 'Code article'

et utiliser les 2 index lorsque je fais des requêtes sur le n° de commande
ET le code article pour une même société ?


"Med Bouchenafa" a écrit dans le message de news:
%23v6%23ia8$
La syntaxe recommandée est
SELECT toto FROM table WITH ( INDEX(Index1,Index2, Index3) )
Je crois me souvenir que le WITH est obligatoire maintenant dans 2005

Pour ce qui est de l'explication, je ne vois rien de spécial par rapport
à ce que dit l'Aide En Ligne
Si l'on prend l'exemple de la table Customers dans la base Northwind et
que l'on regarde les plans de requête de

1) SELECT * FROM Customers

2) SELECT * FROM Customers
WITH(INDEX(City ))

3)SELECT * FROM Customers
WITH(INDEX(City, CompanyName))

4)SELECT * FROM Customers
WITH(INDEX(City, CompanyName,PostalCode, Region ))

A chaque fois SQL Server utilise tous les index spécifiés
A moins que tu veux dire autre chose

--
Bien cordialement
Med Bouchenafa

"Thierry" wrote in message
news:439db55d$0$20145$
Bonjour,

quelqu'un peut-il m'expliquer comment utiliser une requête du style:
SELECT toto FROM table (INDEX(indexA, indexB, ...))

Merci,
Thierry











Avatar
Fred BROUARD
Bonjour,

Comme le dit Med, suel toi peut savoir quels sont les index les plus pertinents
à mettre. Mais il faut prendre en considération les éléments suivants :

1) un index multi colonne ne servira que dans le cas ou :
a) la première colonne est recherchée
b) la première et la seconde colonne sont recherchée et dans l'ordre de
création des colonnes dans l'index.

2) un index CLUSTER sur des données qui ne sont pas chronologiquement ordonnées
(par exemple auto incrément positif) est généralement une très mauvaise idée

3) le type de données sous jacent à l'index à une influence sur les performances
de l'index

4) trop d'index tuent l'index

dans ton cas :

Table contenant:
- code société
- n° de commande (par société)
- code article (par société)
- date

est-il judicieux de créer:
- index1 sur 'Code société' & 'n° de commande'
- index2 sur 'Code société' & 'Code article'

Probablement pas ! En effet Code société va être représenté dans 2 index, soit
avec la table 3 redondance. Les efforts à l'insertion vont donc devenir
importante et le volume des index étant maximisé leurs parcours sera lent.

Quel est le type de données des colonnes ?
Si code société est du VARCHAR il aurait été performant de générer une table des
code société et de mettre en PK un autoinc. De même sur code article.

Tout cela fait partie de l'ioptimisation des bases de données.

Lisez l'article que j'ai écrit sur le sujet :
http://sqlpro.developpez.com/cours/optimiser/

Et voyez le plan du cours que je délivre à ce sujet :
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf

A +

Thierry a écrit:
Bonjour,

quelqu'un peut-il m'expliquer comment utiliser une requête du style:
SELECT toto FROM table (INDEX(indexA, indexB, ...))

Merci,
Thierry





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
GNocent
Si des indexes existent déjà et que tu les penses adaptés, il faut aussi
(surtout ?) te soucier de la mise à jour des statistiques d'indexes, qui
permettra à l'optimizer de faire une bon estimation de coût et donc d'obtenir
le meilleur plan.
Cela permet aussi d'éviter le forçage d'usage d'index par un hint (clause
with) qui n'est jamais très souhaitable, à part en dernière extrémité (pb de
maintenance si un jour tu modifies les indexes ou leur nom, pb si le plan
d'exécution doit changer en raison d'un changement sur la distribution des
données, etc. ...).

S'il s'agit d'un entrepôt de données, donc beaucoup de volume, beaucoup de
lectures, et peu de modifs, tu peux te permettre de mettre un peu plus
d'indexes sur tes tables, voire de colonnes dans tes indexes pour être plus
couvrant, vu que les perfs d'insertion/update seront secondaires.

Guillaume.

"Thierry" a écrit :

j'utilise le plan d'éxécution pour vérifier que SQL me propose le bon index.

Concernant le compteur, comme c'est une application de gestion d'entrepôt,
il y a quelques dizaines d'utilisateurs simultanées sur plusieurs tables.
Difficile donc de savoir sur quelle(s) table(s) se trouve le problème.


"Patrice" a écrit dans le message de news:
OdJPkk8$
> Ok voir la clause FROM dans la doc. Cela permet de "forcer" l'utilisation
> d'un index particulier alors que SQL Server sélectionne normalement
> l'index
> approprié à la situation.
>
> Pas d'idée pour le compteur. C'est un SELECT sur toute une table qui
> semble
> poser problème ?
>
> --
> Patrice
>
> "Thierry" a écrit dans le message de
> news:439e8e02$0$21296$
>> en fait, j'ai de gros problèmes de performance chez un client.
>>
>> J'ai lancé le Performance Monitor avec le compteur "Recherche
>> d'index/secondes" et il prend des valeurs importantes : 200.000 - 280.000
>> J'essaie donc de vérifier mes index et je suis tombé sur cette syntaxe
>> que
>> je ne connaissais pas. Je souhaitais donc en savoir plus sur comment la
>> manière de créer des index 'compatibles' avec cet écriture.
>>
>> En postant sur microsoft.public.sqlserver.programming, les réponses sont
> que
>> je ne devrais utiliser cette syntaxe qu'en dernier recours.
>>
>> Voilà donc ma préoccupation. Par ailleurs, si qqu'un avait une idée pour
>> avoir des valeurs aussi importantes dans le Performance Monitor ....
>>
>>
>> "Patrice" a écrit dans le message de news:
>> eRAmvI8$
>> > Je ne comprends pas trop le sens de la question. C'est une requête
> SELECT
>> > qui s'utilise comme toute autre requête SELECT pour retourner un jeu
>> > d'enregistrements ?
>> >
>> > Où as tu une question sur la clause INDEX dont l'utilisation devrait
> sans
>> > doute être très très exceptionnelle...
>> >
>> > --
>> >
>> > "Thierry" a écrit dans le message de
>> > news:439db55d$0$20145$
>> >> Bonjour,
>> >>
>> >> quelqu'un peut-il m'expliquer comment utiliser une requête du style:
>> >> SELECT toto FROM table (INDEX(indexA, indexB, ...))
>> >>
>> >> Merci,
>> >> Thierry
>> >>
>> >>
>> >
>> >
>>
>>
>
>