IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration SQL Server Discussion :

[SQL 2008] Indexation de table


Sujet :

Administration SQL Server

  1. #21
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 031
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Ptit_Dje Voir le message
    Soit si l'on a une colonne selective en premier, d'après moi, se sera plus efficace pour la recherche d'éléments distincts.
    Si l'on choisis l'autre ordre d'index, avec les colonnes les plus selectives à la fin, d'après moi toujours, se sera plus efficace pour des requètes d'aggrégation car l'on pourra prendre directement un "range" de l'index, sans avoir à parcourir chaque clef selective jusque la fin de l'index.
    Absolument pas, ce sera toujours beaucoup moins efficace que la première car le volume des données sera plus grand car la sélectivité est moins bonne d'entrée de jeu !

    De plus certains requêtes n'utiliserons pas l'index car le volume estimé sera trop important.

    Petite explication :

    Si j'ai deux colonnes, l'une contenant 5 valeurs distribuées comme ceci :
    1 5%
    2 5%
    3 10%
    4 40%
    5 40%
    L'autre contenant 10 valeurs distribuées comme ceci :
    0 5%
    1 5%
    2 5%
    3 5%
    4 10%
    5 10%
    6 10%
    7 10%
    8 20 %
    9 30 %

    Sachant que le seuil pour utiliser l'index ou la table étant de 25 %,
    le premier index composé de C1, C2, utilisera à 60% l'index (3 valeur sur 5), tandis que l'autre l'utilisera à 90% (9 valeurs sur 10).

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  2. #22
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Par défaut
    J'essayais d'expliquer la différence que j'ai pu constater entre 2 littératures.
    Je pense que le mieux va être de tester, chose que je n'ai pas encore faite.

    Merci pour ton avis et ton explication!

  3. #23
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Par défaut
    Hello,

    Je viens d'effectuer un test:

    Soit la table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE [dbo].[Test_Index](
    	[C1] [varchar](30) NULL,
    	[C2] [varchar](30) NULL,
    	[id] [int] IDENTITY(1,1) NOT NULL
    ) ON [PRIMARY]
    Avec une répartition de données comme ceci:
    c1 Nbr_Rows
    Belladone 100000
    Catapulte 50000
    Dupont 400000
    Surprise 50000
    Tartuffe 400000

    c2 Nbr_Rows
    Bi d'joué m'colleau 250000
    Bienvenue chez vous 300000
    Carolingien 100000
    Comment se fesse ? 50000
    Crouperites 50000
    Lulupulus 50000
    Oufti vin'djeu ! 100000
    Pompolom pom polom 50000
    Valorbe baudour 50000

    Table sur laquelle ont été placé 2 index:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create nonclustered index IDX_Selective_Nonselective on Test_Index (C2,C1)
    create nonclustered index IDX_Nonselective_Selective on Test_Index (C1,C2)
    Requètes et statistiques:
    -- Catapule - 5% de données C1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select distinct c2
    from dbo.Test_Index with (index = IDX_Selective_Nonselective)
    where C1 = 'Catapulte'
    Table 'Test_Index'. Scan count 1, logical reads 5493, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select distinct c2
    from dbo.Test_Index with (index = IDX_Nonselective_Selective)
    where C1 = 'Catapulte'
    Table 'Test_Index'. Scan count 1, logical reads 289, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    -- Tartuffe - 40% de données C1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select distinct c2
    from dbo.Test_Index with (index = IDX_Selective_Nonselective)
    where C1 = 'Tartuffe'
    Table 'Test_Index'. Scan count 1, logical reads 5493, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select distinct c2
    from dbo.Test_Index with (index = IDX_Nonselective_Selective)
    where C1 = 'Tartuffe'
    Table 'Test_Index'. Scan count 1, logical reads 2230, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.


    Dans ce cas, l'index le plus performant est l'index constitué des colonnes C1,C2.
    NB: C2 ayant une plus grande dispertion des données


    -- Lulupulus - 5% de données C2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select distinct c1
    from dbo.Test_Index with (index = IDX_Selective_Nonselective)
    where C2 = 'Lulupulus'
    Table 'Test_Index'. Scan count 1, logical reads 230, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select distinct c1
    from dbo.Test_Index with (index = IDX_Nonselective_Selective)
    where C2 = 'Lulupulus'
    Table 'Test_Index'. Scan count 1, logical reads 5493, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    -- Bienvenue chez vous - 30% de données C2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select distinct c1
    from dbo.Test_Index with (index = IDX_Selective_Nonselective)
    where C2 = 'Bienvenue chez vous'
    Table 'Test_Index'. Scan count 1, logical reads 1739, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select distinct c1
    from dbo.Test_Index with (index = IDX_Nonselective_Selective)
    where C2 = 'Bienvenue chez vous'
    Table 'Test_Index'. Scan count 1, logical reads 5493, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.


    Dans ce cas, l'index le plus performant est l'index constitué des colonnes C2,C1.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select c1, count(*)
    from dbo.Test_Index with (index = IDX_Selective_Nonselective)
    where C2 = 'Bienvenue chez vous' and C1 = 'Tartuffe'
    group by c1
    Table 'Test_Index'. Scan count 1, logical reads 706, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select c1, count(*)
    from dbo.Test_Index with (index = IDX_Nonselective_Selective)
    where C2 = 'Bienvenue chez vous' and C1 = 'Tartuffe'
    group by c1
    Table 'Test_Index'. Scan count 1, logical reads 705, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    Dans ce cas, l'index le plus performant (différence vraiment minime) est celui dont les colonnes sont C1,C2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select c2, count(*)
    from dbo.Test_Index with (index = IDX_Selective_Nonselective)
    where C2 = 'Bienvenue chez vous' and C1 = 'Tartuffe'
    group by c2
    Table 'Test_Index'. Scan count 1, logical reads 706, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select c2, count(*)
    from dbo.Test_Index with (index = IDX_Nonselective_Selective)
    where C2 = 'Bienvenue chez vous' and C1 = 'Tartuffe'
    group by c2
    Table 'Test_Index'. Scan count 1, logical reads 705, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    Dans ce cas, l'index le plus performant (différence vraiment minime) est celui dont les colonnes sont C1,C2


    On remarque que la performance des index est fortement liée aux requêtes effectuées sur ceux-ci.
    On remarque qu'une colonne à plus faible dispertion placée en première position donne une meilleure performance sur des requètes d'aggrégation (même si la différence est faible). Est-ce une généralité ? Je ne sais pas... Il faudrait tester

Discussions similaires

  1. Réponses: 11
    Dernier message: 12/09/2012, 17h25
  2. SQL Server 2008 - index unique ou non unique ?
    Par drouhne dans le forum Administration
    Réponses: 3
    Dernier message: 12/10/2010, 16h45
  3. [SQL-2008] Ajout d'une contrainte à une table temporaire
    Par Depite dans le forum Développement
    Réponses: 3
    Dernier message: 26/08/2010, 15h26
  4. SQL SERVER 2005 - SSIS - time out et index de tables
    Par Negaton dans le forum Développement
    Réponses: 7
    Dernier message: 30/06/2010, 11h33
  5. Recreer les indexs de table dans SQL serveur 2000
    Par FilipeVV dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/03/2006, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo