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

D�veloppement SQL Server Discussion :

Indexation de base de donn�es [2016]


Sujet :

D�veloppement SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Localisation : France, Ain (Rh�ne Alpes)

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Par d�faut Indexation de base de donn�es
    Bonjour,

    Je ne comprends pas pourquoi mon code ne marche pas

    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
        DECLARE @TableName NVARCHAR(128), @IndexName NVARCHAR(128), @SQL NVARCHAR(MAX)
     
        DECLARE IndexCursor CURSOR FOR
        SELECT OBJECT_NAME(IPS.object_id) AS TableName, I.name AS IndexName, IPS.index_id, IPS.avg_fragmentation_in_percent
        FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') IPS
        JOIN sys.indexes I ON IPS.object_id = I.object_id AND IPS.index_id = I.index_id
        WHERE I.type_desc <> 'HEAP' AND avg_fragmentation_in_percent > 10
        ORDER BY avg_fragmentation_in_percent DESC;
     
        OPEN IndexCursor
        FETCH NEXT FROM IndexCursor INTO @TableName, @IndexName, @SQL,
     
        WHILE @@FETCH_STATUS = 0
        BEGIN
            SET @SQL = CASE 
                WHEN avg_fragmentation_in_percent > 30 THEN 'ALTER INDEX [' + @IndexName + '] ON [' + @TableName + '] REBUILD;'
                ELSE 'ALTER INDEX [' + @IndexName + '] ON [' + @TableName + '] REORGANIZE;'
            END
            PRINT @SQL
            EXEC sp_executesql @SQL
            FETCH NEXT FROM IndexCursor INTO @TableName, @IndexName, @SQL
        END
     
        CLOSE IndexCursor
        DEALLOCATE IndexCursor
    Pouvez-vous m'aider ?

  2. #2
    Mod�rateur
    Avatar de al1_24
    Homme Profil pro
    Retrait�
    Inscrit en
    Mai 2002
    Messages
    9 136
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 64
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Retrait�
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par d�faut
    Bonjour,

    Citation Envoy� par Mont73 Voir le message
    mon code ne marche pas
    Qu'entends-tu par l� ?
    O� rencontres-tu un probl�me ?

    • Une erreur d'ex�cution ?
      Quel est le message associ� ?
    • Un r�sultat erron� ?
      Quel est le r�sultat obtenu ? Le r�sultat attendu ?
      En quoi le r�sultat obtenu ne correspond-il pas � tes attentes ?
    Mod�rateur Langage SQL
    R�gles du forum Langage SQL � lire par tous, N'h�sitez pas � consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une r�ponse vous a aid� � r�soudre votre probl�me, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un probl�me expos� sans mentionner les tentatives de r�solution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail � sa place... et ne donne pas envie d'y r�pondre.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Localisation : France, Ain (Rh�ne Alpes)

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Par d�faut
    Il me dit que le champ test� dans case when n�existe pas alors qu'il est dans ma requ�te.

    J'attent du script qu'il reconstruise mes indexes ou qu'il les reorganise suivant le pourcentage de fragment

  4. #4
    R�dacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de donn�es / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 002
    Billets dans le blog
    6
    Par d�faut
    Il manque la variable pour recueillir cette information... C'est l� votre erreur !
    De plus vous ne mettez pas le sch�ma SQL en pr�fixe de la table.... Cela partira en erreur si un index de table syst�me est vis� par votre script, car les tables syst�mes sont dans le sch�ma "sys".

    Aussi il est pr�f�rable de faire des jointures plut�t que d'appeler des fonctions comme OBJECT_NAME
    ensuite il est pr�f�rable d'ouvrir un curseur avec les options suivantes :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    LOCAL FORWARD_ONLY STATIC READ_ONLY
    Enfin vous n'utilisez pas la colonne index_id. Elle est donc inutile dans votre SELECT.
    Conseil :
    • utilisez "sysname" qui est le domaine r�serv� pour les identifiants SQL � la place de NVARCHAR(128)...
    • terminez vos instructions par le point-virgule ";"
    • utilisez QUOTENAME pour �viter les effets de bord des identifiants qui ne respecte pas la norme SQL
    • faite pr�cer vos chaines de caract�res de la lettre "N" majuscule pour le type NCHAR/NVARCHAR
    • utilisez directement EXEC("ma requ�te string") plut�t que la proc�dure sp_executesql pour des requ�tes aussi simples...



    Script rectifi� :

    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
    DECLARE @TableName sysname, 
            @TABLE_SCHEMA sysname,
            @IndexName sysname, 
            @FRAGMENTATION FLOAT,
            @SQL NVARCHAR(MAX);
     
    DECLARE IndexCursor CURSOR 
       LOCAL FORWARD_ONLY STATIC READ_ONLY
       FOR   SELECT o.name AS TableName, 
                    s.name AS TableSchema,
                    i.name AS IndexName, 
                    IPS.avg_fragmentation_in_percent
             FROM   sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') AS IPS
                    JOIN sys.indexes AS i ON IPS.object_id = i.object_id AND IPS.index_id = i.index_id
                    JOIN sys.objects AS o ON IPS.object_id = o.object_id
                    JOIN sys.schemas AS s ON o.schema_id = s.schema_id
             WHERE  i.type_desc <> 'HEAP' AND avg_fragmentation_in_percent > 10
             ORDER  BY avg_fragmentation_in_percent DESC;
     
    OPEN IndexCursor;
     
    FETCH NEXT FROM IndexCursor 
       INTO @TableName, @TABLE_SCHEMA, @IndexName, @FRAGMENTATION;
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
     
       SET @SQL = N'ALTER INDEX ' + QUOTENAME(@IndexName) 
                + N' ON ' + QUOTENAME (@TABLE_SCHEMA) + N'.' + QUOTENAME(@TableName) 
                + CASE 
                     WHEN @FRAGMENTATION > 30 
                        THEN N' REBUILD;'
                     ELSE N' REORGANIZE;'
                  END;
     
        PRINT @SQL;
     
        EXEC (@SQL);
     
        FETCH NEXT FROM IndexCursor 
           INTO @TableName, @TABLE_SCHEMA, @IndexName, @FRAGMENTATION;
    END
     
    CLOSE IndexCursor;
     
    DEALLOCATE IndexCursor;
    Enfin il n'est pas souhaitable de d�fragmenter de tr�s petits index (moins de 64 pages par exemple) et il est en revanche int�ressant de reconstruire les tables en HEAP...

    Dans ce cas :

    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
    51
    DECLARE @TableName sysname, 
            @TABLE_SCHEMA sysname,
            @IndexName sysname, 
            @FRAGMENTATION FLOAT,
            @HEAP bit,
            @SQL NVARCHAR(MAX);
     
    DECLARE IndexCursor CURSOR 
       LOCAL FORWARD_ONLY STATIC READ_ONLY
       FOR   SELECT QUOTENAME(o.name) AS TableName, 
                    QUOTENAME(s.name) AS TableSchema,
                    QUOTENAME(i.name) AS IndexName, 
                    IPS.avg_fragmentation_in_percent,
                    CASE WHEN i.type_desc = 'HEAP' THEN 1 ELSE 0 END AS IS_HEAP
             FROM   sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') AS IPS
                    JOIN sys.indexes AS i ON IPS.object_id = i.object_id AND IPS.index_id = i.index_id
                    JOIN sys.objects AS o ON IPS.object_id = o.object_id
                    JOIN sys.schemas AS s ON o.schema_id = s.schema_id
             WHERE  avg_fragmentation_in_percent > 10
                    AND page_count > 64
             ORDER  BY avg_fragmentation_in_percent DESC;
     
    OPEN IndexCursor;
     
    FETCH NEXT FROM IndexCursor 
       INTO @TableName, @TABLE_SCHEMA, @IndexName, @FRAGMENTATION, @HEAP;
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
     
       SET @SQL = CASE
                     WHEN @HEAP = 1
                        THEN N'ALTER TABLE ' + @TABLE_SCHEMA + N'.' + @TableName + ' REBUILD;'
                     WHEN @FRAGMENTATION > 30 
                        THEN  N' REBUILD;'
                     ELSE N'ALTER INDEX ' + @IndexName 
                             + N' ON ' + @TABLE_SCHEMA + N'.' + @TableName + N' REORGANIZE;'
                  END;
     
        PRINT @SQL;
     
        EXEC (@SQL);
     
        FETCH NEXT FROM IndexCursor 
           INTO @TableName, @TABLE_SCHEMA, @IndexName, @FRAGMENTATION, @HEAP;
     
    END
     
    CLOSE IndexCursor;
     
    DEALLOCATE IndexCursor;
    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/ * * * * *

  5. #5
    Membre Expert
    Homme Profil pro
    Architecte de base de donn�es
    Inscrit en
    Septembre 2016
    Messages
    961
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 58
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Architecte de base de donn�es
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 961
    Par d�faut
    Citation Envoy� par Mont73 Voir le message
    J'attent du script qu'il reconstruise mes indexes ou qu'il les reorganise suivant le pourcentage de fragment
    C'est toujours interressant de savoir faire les choses par soi m�me ^^

    Cependant, au del� de l'�tape d'apprentissage, il est utile d'utiliser du code maintenu.
    Et pour le besoin explicit�, je vous conseille d'aller voir celui de OLA : https://ola.hallengren.com/

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 4
    Dernier message: 16/12/2004, 13h56
  2. base de donn� sans avoir un serveur!!
    Par Sawbo dans le forum Bases de donn�es
    R�ponses: 7
    Dernier message: 30/07/2004, 09h08
  3. probleme construction base de donnes MySql...Help
    Par chakan dans le forum Requ�tes
    R�ponses: 7
    Dernier message: 21/07/2004, 11h27
  4. [Tomcat][Oracle] connexion base de donnes debutant....
    Par yogz dans le forum Tomcat et TomEE
    R�ponses: 8
    Dernier message: 16/07/2004, 13h32
  5. connexion base de donn�
    Par saidi dans le forum MFC
    R�ponses: 3
    Dernier message: 07/08/2002, 22h22

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