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 :

Analyse des Index d'une base


Sujet :

Administration SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 731
    Par défaut Analyse des Index d'une base
    Bonjour,

    Je cherche à avoir le taux de fragmentation de tous les index de ma base ? dans quelle vue chercher ?

    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    J'ai ce vieux bout de code sous le coude :
    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
    -- recherche d'index fragmenté
    declare @bd_id int
    set @bd_id = db_id() ;
    with SR as (
    	SELECT u.NAME AS table_schema, OBJECT_NAME(i.object_id) AS table_name, i.name AS table_index_name, phystat.avg_fragmentation_in_percent, ROWS
    	FROM sys.dm_db_index_physical_stats(@bd_id, NULL, NULL, NULL,'SAMPLED') phystat
    	INNER JOIN sys.indexes i ON i.object_id = phystat.object_id AND i.index_id = phystat.index_id
    	INNER JOIN sys.partitions p WITH ( NOLOCK ) ON p.OBJECT_ID = i.OBJECT_ID
    	INNER JOIN sys.sysobjects o WITH ( NOLOCK ) ON o.ID = i.OBJECT_ID
    	INNER JOIN sys.schemas u WITH ( NOLOCK ) ON u.schema_id = o.uid
    	WHERE rows >= 100000
    )
    select table_schema, table_name, table_index_name, avg_fragmentation_in_percent, rows,
    	'ALTER INDEX ['+table_index_name+'] ON ['+table_schema+'].['+table_name+'] REBUILD WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, SORT_IN_TEMPDB = OFF, ONLINE = OFF )' SQL_Commande
    from SR
    WHERE avg_fragmentation_in_percent >= 5
    group by table_schema, table_name, table_index_name, avg_fragmentation_in_percent, rows
    order by avg_fragmentation_in_percent desc ,table_schema, table_name, table_index_name

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 731
    Par défaut
    Bonjour,

    Merci bcp, grâce à cette requête je récupère 2 index avec 92% et 84 %.

    @+

  4. #4
    Membre Expert
    Homme Profil pro
    DBA SQL Server
    Inscrit en
    Octobre 2012
    Messages
    862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA SQL Server
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 862
    Par défaut
    Bonjour,

    J'ai celle-ci, l'avantage c'est qu'elle donne un % de fragmentation pour tous les indexes de toutes les DB sur l'instance.

    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
     
    -- Attention, cela peut tourner plus de 10 minutes voir plus...
     
    USE TEMPDB
    GO
    create table #IndexFragmentation  (
    [Database Name] sysname,
    [Table Name] sysname,
    [Index Name] sysname NULL,
    [Index_type_desc] varchar(256),
    [avg_fragmentation_in_percent] decimal(15,2),
    [Page_count] int
    )
    DECLARE @CMD VARCHAR(MAX)
    SET @CMD = N'use [?] 
    SELECT DB_NAME(ps.database_id) AS [Database Name], OBJECT_NAME(ps.OBJECT_ID) AS [Table Name], 
    i.name AS [Index Name], ps.index_type_desc, ps.avg_fragmentation_in_percent, 
    ps.page_count
    FROM sys.dm_db_index_physical_stats(DB_ID(),NULL, NULL, NULL , N''LIMITED'') AS ps
    INNER JOIN sys.indexes AS i WITH (NOLOCK)
    ON ps.[object_id] = i.[object_id] 
    AND ps.index_id = i.index_id
    WHERE ps.database_id = DB_ID()
    AND ps.page_count > 2500
    ORDER BY ps.avg_fragmentation_in_percent DESC OPTION (RECOMPILE);'
     
    Insert into #IndexFragmentation
    exec sp_MSForEachDB @CMD
     
    select * from #IndexFragmentation
    order by avg_fragmentation_in_percent desc
    drop table #IndexFragmentation

Discussions similaires

  1. Analyse des paramètres d'une base
    Par farenheiit dans le forum Administration
    Réponses: 26
    Dernier message: 01/04/2009, 17h05
  2. Récupérer la liste des indexes d'une base
    Par Najdar dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/07/2008, 12h15
  3. Listes des indexes d'une base de de données
    Par The eye dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 11/01/2008, 11h55
  4. Recalcul des index d'une base de données
    Par lio33 dans le forum SQL
    Réponses: 4
    Dernier message: 18/08/2006, 15h01
  5. Script permettant de créer l'ensemble des indexes d'une base
    Par matacars dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 01/07/2005, 16h14

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