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

MS SQL Server Discussion :

[SQL2K5] Création d'index


Sujet :

MS SQL Server

  1. #1
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut [SQL2K5] Création d'index
    Bonjour,

    J'ai une requête qui, lorque je l'analyse avec SET STATISTICS IO ON, me fait beaucoup trop de logical reads (plus de 25000) sur maTableA.

    Voici la requête, sans le SELECT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FROM dbo.maTableA(nolock)
    INNER JOIN dbo.maTableB (nolock) ON maTableA.ID_A = maTableB.ID_A
    WHERE maTableA.maColonne1 = 1
    AND maTableA.maColonne2 < GETDATE()
    AND (maTableA.maColonne3 < GETDATE() OR maTableA.maColonne3 IS NULL)
    AND maTableA.maColonne4 NOT IN (maListeDeValeurs)
    Pour l'optimiser, je décide donc de faire un index non cluster sur maTableA avec un FILLFACTOR à 50 (beaucoup d'insert et d'update sur maTableA), et PAD_INDEX à ON, qui porte sur les colonnes ID_A, maColonne1 , maColonne2, maColonne3 et maColonne4.
    Malheureusement, j'ai toujours le même nombre de logical reads sur maTableA, c'est donc que je n'ai pas compris grand chose à la conception d'indexes ...

    Quelqu'un peut-il m'expliquer ?

    En vous remerciant

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 285
    Points : 139
    Points
    139
    Par défaut
    Alors, j'y connais pas grand chose non plus mais tu devrais essayer la commande suivante

    [code]
    DBCC SHOWCONTIG('<Ta_TABLE>')
    [code]

    Si le nombre d'extensions commutées est supérieur au nombre d'extension analysé c'est que ta table est un gruyère.

    Tu devrais essayer de créer un index cluster ou passer la commande
    Si tu as un index cluster, ta table sera re-ordonné en base et tu devrais avoir moins de lecture ...

    PS : Essaye également de stocker dans une variable ton GetDate ...

    Ps2 : Je dis pte n'importe quoi mais chez j'ai résolu le pb comme cela !

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 922
    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 : 21 922
    Points : 51 719
    Points
    51 719
    Billets dans le blog
    6
    Par défaut
    Un index multicolonne ne sert pas à grand chose dans votre cas d'autant plus que vous n'avez pas montré la clause SELECT !

    Y a t-il des index sur la colonne ID_A dans les DEUX tables ?

    Il n'est pas possible d'indexer des expressions avec des OR de même qu'avec des NOT IN.
    Il faut trouver une autre expression de la requête.
    Par exemple (un début), pourrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    FROM  dbo.maTableA
    INNER JOIN dbo.maTableB
          ON maTableA.ID_A = maTableB.ID_A
    WHERE maTableA.maColonne1 = 1
    AND maTableA.maColonne2 < GETDATE()
    AND maTableA.maColonne3 < GETDATE()
    AND maTableA.maColonne4 NOT IN (maListeDeValeurs)
    UNION
    FROM  dbo.maTableA
    INNER JOIN dbo.maTableB 
          ON maTableA.ID_A = maTableB.ID_A
    WHERE maTableA.maColonne1 = 1
    AND maTableA.maColonne2 < GETDATE()
    AND maTableA.maColonne3 IS NULL
    AND maTableA.maColonne4 NOT IN (maListeDeValeurs)
    Sachez enfin que le NOLOCK introduit des incohérence de données. J'espère donc que cette requête n'est que consultative !

    A +

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Voici le code complet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    SELECT
    	ABONNE.IDABONNE [ABONNE.IDABONNE],
    	ABONNE.IDCLIENT [ABONNE.IDCLIENT],
    	ABONNE.IDSERVICE [ABONNE.IDSERVICE],
    	ABONNE.GUID [ABONNE.GUID],
    	ABONNE.IDPREFIX [ABONNE.IDPREFIX],
    	ABONNE.IDSHORTSNO [ABONNE.IDSHORTSNO],
    	ABONNE.IDMEDIACODE [ABONNE.IDMEDIACODE],
    	ABONNE.SNO [ABONNE.SNO],
    	ABONNE.TRANSID [ABONNE.TRANSID],
    	ABONNE.LINKEDID [ABONNE.LINKEDID],
    	ABONNE.OPERATORCLIENTID [ABONNE.OPERATORCLIENTID],
    	ABONNE.UNSUBSCRIPTIONREQUESTED [ABONNE.UNSUBSCRIPTIONREQUESTED],
    	ABONNE.IDSMSUNSUBSCRIPTION [ABONNE.IDSMSUNSUBSCRIPTION],
    	ABONNE.ORGPREFIX [ABONNE.ORGPREFIX],
    	ABONNE.REMINDERDATETIME [ABONNE.REMINDERDATETIME],
    	ABONNE.RENEWDATETIME [ABONNE.RENEWDATETIME],
    	ABONNE.SENDPERIODICCONTENTDATETIME [ABONNE.SENDPERIODICCONTENTDATETIME],
    	ABONNE.EXPIREDDATETIME [ABONNE.EXPIREDDATETIME],
    	ABONNE.UNSUBSCRIBABLEDATETIME [ABONNE.UNSUBSCRIBABLEDATETIME],
    	ABONNE.UNSUBSCRIPTIONDATETIME [ABONNE.UNSUBSCRIPTIONDATETIME],
    	ABONNE.LIMITOVERCEILINGDATETIME [ABONNE.LIMITOVERCEILINGDATETIME],
    	ABONNE.LASTBILLEDDATETIME [ABONNE.LASTBILLEDDATETIME],
    	ABONNE.CREATEDDATETIME [ABONNE.CREATEDDATETIME],
    	ABONNE.UPDATEDDATETIME [ABONNE.UPDATEDDATETIME],
    	ABONNE.IDEMPLOYEE [ABONNE.IDEMPLOYEE],
    	ABONNE.IDABONNESTATUS [ABONNE.IDABONNESTATUS],
    	ABONNE.SCORE [ABONNE.SCORE],
    	ABONNE.SEQUENCE [ABONNE.SEQUENCE],
    	ABONNE.GENDER [ABONNE.GENDER],
    	ABONNE.AGE [ABONNE.AGE],
    	ABONNE.TOWN [ABONNE.TOWN],
    	ABONNE.PSEUDO [ABONNE.PSEUDO],
    	CLIENT.MSN [CLIENT.MSN],
    	CLIENT.IDCLIENTSTATUS [CLIENT.IDCLIENTSTATUS],
    	CLIENT.DESCRIPTION [CLIENT.DESCRIPTION],
    	CLIENT.CREATEDDATETIME [CLIENT.CREATEDDATETIME],
    	CLIENT.UPDATEDDATETIME [CLIENT.UPDATEDDATETIME],
    	CLIENT.IDOPERATOR [CLIENT.IDOPERATOR],
    	CLIENT.IDNETWORK [CLIENT.IDNETWORK],
    	CLIENT.IDGATEWAY [CLIENT.IDGATEWAY],
    	CLIENT.IDEMPLOYEE [CLIENT.IDEMPLOYEE]
    FROM dbo.ABONNE
    INNER JOIN dbo.CLIENT ON ABONNE.IDCLIENT = CLIENT.IDCLIENT
    WHERE ABONNE.IDABONNESTATUS = 1
    AND ABONNE.REMINDERDATETIME < GETDATE()
    AND (ABONNE.LIMITOVERCEILINGDATETIME < GETDATE() OR ABONNE.LIMITOVERCEILINGDATETIME IS NULL)
    AND IDSERVICE NOT IN (SELECT IDSERVICE FROM dbo.SMSSERVICE WHERE MINUTESOFREMINDER = 0 OR MINUTESOFREMINDER IS NULL OR ISACTIVE = 0 )
    AND IDSERVICE IN (SELECT IDSERVICE FROM dbo.SMSSERVICE WHERE (IDSERVICETYPE IN (2,5,7,8) AND IDCOMPANY = 2))
    J'ai créé des index sur les prédicats de recherche montrés par le plan de requête, mais rien n'y fait ...

    La requête est effectivement une requête de consultation pure

    Maitrebn, effectivement stocker GETDATE() dans une variable dès le début de la requête diminue le nombre de reads.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    tu peux aussi jouer avec les left outer join

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    FROM dbo.ABONNE
    INNER JOIN dbo.CLIENT ON ABONNE.IDCLIENT = CLIENT.IDCLIENT
    LEFT OUTER JOIN dbo.SMSSERVICE SMS ON ABONNE.IDSERVICE=SMS.IDSERVICE
    INNER JOIN dbo.SMSSERVICE SMS2 ON (ABONNE.IDSERVICE=SMS2.IDSERVICE)
    WHERE ABONNE.IDABONNESTATUS = 1
    AND ABONNE.REMINDERDATETIME < GETDATE()
    AND (ABONNE.LIMITOVERCEILINGDATETIME < GETDATE() OR ABONNE.LIMITOVERCEILINGDATETIME IS NULL)
    AND (SMS.MINUTESOFREMINDER = 0 OR SMS.MINUTESOFREMINDER IS NULL OR SMS.ISACTIVE = 0 AND SMS.IDSERVICE IS NULL) 
    AND (SMS2.IDSERVICETYPE IN (2,5,7,8) AND SMS2.IDCOMPANY = 2)

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Merci à tous pour vos conseils, ça fonctionne mieux maintenant

    En regardant pour le extents, sur une table j'ai ceci:



    Comment faire pour avoir nombre d'extensions commutées inférieur au nombre d'extension analysées, comme le préconise maitrebn ?

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 922
    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 : 21 922
    Points : 51 719
    Points
    51 719
    Billets dans le blog
    6
    Par défaut
    C'est pas catastrophique !

    DBCC DBREINDEX

    A +

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    ou:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ALTER INDEX monIndex
    ON maTable REBUILD
    WITH (ONLINE = ON, FILLFACTOR = monFillFactor, PAD_INDEX = ON);
    Dans quel cas estime-t-on que c'est catastrophique ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DBF]Comment afficher progression de création d'index?
    Par fruaud dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 28/12/2005, 12h38
  2. Réponses: 15
    Dernier message: 16/08/2005, 15h43
  3. Stratégie de création d'indexes
    Par nosnoss dans le forum Oracle
    Réponses: 6
    Dernier message: 01/07/2005, 11h37
  4. Création d'index sur un TTable
    Par bencot dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/03/2005, 14h23
  5. Création d'Index
    Par viny dans le forum Requêtes
    Réponses: 2
    Dernier message: 08/12/2003, 14h20

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