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 :

"sys.dm_db_partition_stats" et "SET STATISTICS IO"


Sujet :

Administration SQL Server

  1. #1
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut "sys.dm_db_partition_stats" et "SET STATISTICS IO"
    Hello,
    J'ai besoin encore de votre lumière.
    Pour obtenir le nombre total de pages occupées par la table T_TEST, j'ai fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SET STATISTICS IO ON
    SELECT * FROM T_TEST
    SET STATISTICS IO OFF
    Et obtenir le résultat suivant :

    --(1000000 row(s) affected)
    --Table 'T_TEST'. Nombre d'analyses 1, lectures logiques 219698, lectures physiques 0, lectures anticipées 0, lectures logiques de données d'objets volumineux 0, lectures physiques de données d'objets volumineux 0, lectures anticipées de données d'objets volumineux 0.
    Par contre en utilisant la DMV "sys.dm_db_partition_stats", je trouve une valeur différente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT partition_id,
           SUM(used_page_count) AS total_number_of_used_pages, 
           SUM (reserved_page_count) AS total_number_of_reserved_pages,
           SUM (row_count) AS total_number_of_rows    
    FROM sys.dm_db_partition_stats
    WHERE object_id=OBJECT_ID(N'MaBase.dbo.T_TEST') AND (index_id=0 or index_id=1)
    GROUP BY partition_id

    partition_id-------------------- total_number_of_used_pages --------------------total_number_of_reserved_pages -------------------- total_number_of_rows
    72057594042187776-------------------- 5416 ---------------------------------------- 5417 -------------------------------------------1000000

    d'où provient cette différente ? Merci de m'éclairer.

    -- Voici la table T_TEST

    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
    --Création de la table
    SET NOCOUNT ON 
    IF OBJECT_ID('dbo.T_TEST') IS NOT NULL 
    DROP TABLE dbo.T_TEST 
    CREATE TABLE dbo.T_TEST 
    ( 
      id int identity(1,1), 
      val varchar(10), 
      creation_date datetime 
    )
     
    --Chargement d'1 million de lignes dans la table 
    DECLARE @counter int; 
    SET @counter = 1; 
    WHILE @counter <= 1000000 
      BEGIN 
      INSERT INTO T_TEST(val,creation_date) VALUES(convert(varchar(10),(LEFT(convert(bigint,RAND()*10000000),6))),getdate()); 
      SET @counter = @counter + 1 
    END;
    Etienne ZINZINDOHOUE
    Billets-Articles

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Tu m'étonnes... Chez moi j'ai 4017 lectures logiques en activant les statistiques de lecture sur la table.

    ++

  3. #3
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Bonjour,

    Tu m'étonnes... Chez moi j'ai 4017 lectures logiques en activant les statistiques de lecture sur la table.

    ++
    Les résultats que j'ai donné précédemment concernent SQL SERVER 2008 R2.

    par contre sous SQL 2005 SP3

    J'obtiens ceci :
    Pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SET STATISTICS IO ON
    SELECT * FROM T_TEST 
    SET STATISTICS IO OFF
    J'ai

    (1000000 row(s) affected)
    Table 'T_TEST'. Nombre d'analyses 1, lectures logiques 4017, lectures physiques 0, lectures anticipées 0, lectures logiques de données d'objets volumineux 0, lectures physiques de données d'objets volumineux 0, lectures anticipées de données d'objets volumineux 0.
    Pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT partition_id,
           SUM(used_page_count) AS total_number_of_used_pages, 
           SUM (reserved_page_count) AS total_number_of_reserved_pages,
           SUM (row_count) AS total_number_of_rows    
    FROM sys.dm_db_partition_stats
    WHERE object_id=OBJECT_ID(N'MaBase.dbo.T_TEST') AND (index_id=0 or index_id=1)
    GROUP BY partition_id
    J'obtiens

    partition_id --------------------total_number_of_used_pages --------------------total_number_of_reserved_pages-------------------- total_number_of_rows
    72057594040352768-------------------- 4018---------------------------------------- 4025 --------------------------------------------1000000
    Etienne ZINZINDOHOUE
    Billets-Articles

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Les résultats que j'ai donné précédemment concernent SQL SERVER 2008 R2.
    Je suis sur SQL Server 2008 R2 également et j'obtiens toujours mes 4017 lectures logiques.

    ++

  5. #5
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Je suis sur SQL Server 2008 R2 également et j'obtiens toujours mes 4017 lectures logiques.

    ++
    4017 pour les 2 méthodes ? SET STATISTICS et "sys.dm_db_partition_stats" ?
    Etienne ZINZINDOHOUE
    Billets-Articles

  6. #6
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Je suis sur SQL Server 2008 R2 également et j'obtiens toujours mes 4017 lectures logiques.

    ++

    Le calcul de façon rudimentaire du nombre de pages de la tabe (sans les index) me donne 3367 pages

    Méthode utilisée
    Etienne ZINZINDOHOUE
    Billets-Articles

  7. #7
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    N'importe quelle méthode utilisée me donne 4017 pages, ce qui est normal.
    En passant par la DMV sys.dm_db_index_physical_stats on obtient le même résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 
     record_count,
     page_count
    FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('T_TEST'), NULL, NULL, 'DETAILED')
    La page en plus trouvée via la vue sys.dm_db_partition_stats est concerne la page IAM.

    ++

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 758
    Points : 1 069
    Points
    1 069
    Par défaut
    Si le but est juste de déterminer le nombre de pages pour une table ou un index, utiliser plutôt sys.dm_db_index_physical_stats().
    David B.

  9. #9
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Chez moi sur SQL Server 2005 SP3 j'ai des résultats qui concordent :
    ==================================================

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SET STATISTICS IO ON
    SELECT * FROM T_TEST 
    SET STATISTICS IO OFF
    donne 4017


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT partition_id,
           SUM(used_page_count) AS total_number_of_used_pages, 
           SUM (reserved_page_count) AS total_number_of_reserved_pages,
           SUM (row_count) AS total_number_of_rows    
    FROM sys.dm_db_partition_stats
    WHERE object_id=OBJECT_ID(N'MaBase.dbo.T_TEST') AND (index_id=0 OR index_id=1)
    GROUP BY partition_id
    donne 4018

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBCC SHOWCONTIG ('Mabase.dbo.T_TEST')
    donne :
    - Pages analysées................................: 4017


    Pour SQL SERVER 2008 R2
    ==================================================

    J'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SET STATISTICS IO ON
    SELECT * FROM T_TEST 
    SET STATISTICS IO OFF
    donne 219698


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT partition_id,
           SUM(used_page_count) AS total_number_of_used_pages, 
           SUM (reserved_page_count) AS total_number_of_reserved_pages,
           SUM (row_count) AS total_number_of_rows    
    FROM sys.dm_db_partition_stats
    WHERE object_id=OBJECT_ID(N'MaBase.dbo.T_TEST') AND (index_id=0 OR index_id=1)
    GROUP BY partition_id
    donne 5416


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBCC SHOWCONTIG ('Mabase.dbo.T_TEST')
    donne :
    - Pages analysées................................: 5415


    Je ne comprends plus rien
    Etienne ZINZINDOHOUE
    Billets-Articles

  10. #10
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Que donne la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
     record_count,
     page_count,
     avg_fragmentation_in_percent,
     avg_page_space_used_in_percent
    FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('T_TEST'), NULL, NULL, 'DETAILED')
    ++

  11. #11
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Que donne la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
     record_count,
     page_count,
     avg_fragmentation_in_percent,
     avg_page_space_used_in_percent
    FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('T_TEST'), NULL, NULL, 'DETAILED')
    ++

    record_count ----------------------- page_count -----------------------avg_fragmentation_in_percent----------------------- avg_page_space_used_in_percent
    1214283--------------------------- 5415------------------------------ 0,882352941176471--------------------------- 98,3305534964171



    Je comprends maintenant d'où provient la confusion, au fait j'avais ajouter une colonne sur la table T_TEST. Voici la DDL de la table qui fausse tout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE [dbo].[T_TEST](
    	[id] [int] IDENTITY(1,1) NOT NULL,
    	[val] [varchar](10) NULL,
    	[creation_date] [datetime] NULL,
    	[CALC_LOWER_FROMADDRESS]  AS (lower([val])) PERSISTED
    ) ON [PRIMARY]
    Je reprends tous mes tests
    Etienne ZINZINDOHOUE
    Billets-Articles

  12. #12
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SET STATISTICS IO ON
    SELECT * FROM dbo.T_TEST
    SET STATISTICS IO OFF
    Résultat : lectures logiques 4017
    ======


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT partition_id,
    	   SUM(used_page_count) AS total_number_of_used_pages, 
           SUM (reserved_page_count) AS total_number_of_reserved_pages,
           SUM (row_count) AS total_number_of_rows    
    FROM sys.dm_db_partition_stats
    WHERE object_id=OBJECT_ID(N'Optimisation.dbo.T_TEST') AND (index_id=0 or index_id=1)
    GROUP BY partition_id
    Résultat : total_number_of_used_pages 4018
    ======


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
     record_count,
     page_count,
     avg_fragmentation_in_percent,
     avg_page_space_used_in_percent
    FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('T_TEST'), NULL, NULL, 'DETAILED')

    Résultat : Page_count 4017
    ======

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBCC SHOWCONTIG (N'Optimisation.dbo.T_TEST')
    Résultat : Pages analysées................................ 4017
    ======


    Vu ces résultats, je pense que l'utilisation de la DMV "sys.dm_db_partition_stats" n'est pas appropriée pour obtenir nombre de pages utilisées par une table.
    Il me semble aussi que l'utilisation de DBCC SHOWCONTIG est déconseillée et MS suggère l'utilisation de la vue "sys.dm_db_index_physical_stats".

    Ces résultats me conduisent à revoir ma copie

    Merci à tous !
    Etienne ZINZINDOHOUE
    Billets-Articles

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

Discussions similaires

  1. Problème saturation RAM après GFIX SWEEP SET statistics INDEX
    Par korntex5 dans le forum Administration
    Réponses: 4
    Dernier message: 29/10/2013, 08h50
  2. ALTER INDEX vs SET STATISTICS
    Par GUIGUItwo dans le forum Administration
    Réponses: 1
    Dernier message: 27/05/2010, 15h45
  3. Impact performances sur Set statistics time
    Par SetaSensei dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/05/2010, 14h19

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