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 :

Problème de performance sys.dm_db_index_physical_stats


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Points : 134
    Points
    134
    Par défaut Problème de performance sys.dm_db_index_physical_stats
    Bonjour,

    Je vous écris ce message car j'ai des problèmes de performance sur une requête.

    Contexte : Grosse DB de plusieurs TO
    Shelduled Jobs : Rebuild des index si une table est trop fragmentée (plus de 12%)
    SELECT utilisé en entrée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT
        object_id,
        index_id,
        partition_number,
        avg_fragmentation_in_percent
    INTO #work_to_do
    FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED') 
    WHERE avg_fragmentation_in_percent > 12.0 
    AND index_id > 0;
    Seulement voilà, en général ce select met une 20aine de secondes à donner un résultat mais parfois il faut plusieurs heures!

    Je ne comprends pas ce qui pose ces problèmes de performances... Quand j'exécute le SELECT il peut ne pas me donner de résultat au point de devoir killer le select, si je relance quelques minutes après il me sort le résultat en quelques secondes. Tout ça en désactivant les autres requêtes susceptible de tourner, rien d'autre ne tourne sur le server.

    Le soucis lors de l'exécution normale de cette tâche Schedulée est que si elle prend trop de temps, elle bloque alors un/des autre(s) processus Schedulés quelques heures après... Au point que les processus se bloquent entre-eux et un kill manuel est obligatoire...

    J'ai donc plusieurs questions :
    1. Quelle pourrait-être la cause de cette différence de temps entre 2 exécutions?
    2. Est-ce qu'on peut améliorer la performance de cette query? (En tout cas s'assurer qu'elle prenne toujours autant de temps)
    3. Sinon, existe-t-il une option à ajouter à la query pour ne pas qu'elle bloque l'exécution des suivantes?
    4. D'autres idées? ^^


    Microsoft SQLServer 2012
    Microsoft SQL Server Management Studio 11.0.3128.0
    Microsoft Analysis Services Client Tools 11.0.3128.0
    Microsoft Data Access Components (MDAC) 6.2.9200.16384
    Microsoft MSXML 3.0 4.0 6.0
    Microsoft Internet Explorer 9.10.9200.16635
    Microsoft .NET Framework 4.0.30319.18051
    Operating System 6.2.9200
    Merci.
    Cordialement.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    La fonction sys.dm_db_index_physical_stats nécessite un verrou de table IS (Intent-Shared), et ce, quel que soit son mode d'exécution (LIMITED, SAMPLED ou DETAILED).

    Le verrou IS (Intent-Shared) est par essence incompatible avec les verrous de type X (Exclusive)

    Si pour une raison ou une autre un verrou Exlusif (X) est posé sur une des table ( exemple un SELECT avec l'indicateur with (TABLOCKX) effectué à l'intérieur d'une très très longue transaction, ayant pour niveau d'isolation REPEATABLE READ, ou SERIALIZABLE), vous pouvez attendre très très longtemps ! (des heures !)

    - Essayez dans un premier temps de limiter l'étendu du résultat de la fonction sys.dm_db_index_physical_stats. Pour cela, essayez de traiter les tables une par une (voire même les indexes un par un), et ce en précisant le deuxième paramètre (Object_id de la table) voire même le troisième (object_id de l'index).
    Exemple :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('dbo.MaTable') , NULL, NULL , 'LIMITED');

    - Rajoutez au besoin un SET LOCK_TIMEOUT avant et après l'instruction
    Code 'SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SET LOCK_TIMEOUT nnnnnn   -- nnnnn exprimé en millisendes 
    GO 
    SELECT * FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('dbo.T_CLIENT_CLI')  , NULL, NULL , 'LIMITED') 
    ... 
    GO 
    -- revenir à la valur par défaut 
    SET LOCK_TIMEOUT -1   -- valeur par défaut  c.à.d attente infinie !
    GO

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  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 772
    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 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    C'est normal, pour avoir les statistiques il faut aller lire toutes les pages. Pour cela il faut qu'elles soient en mémoire et libre d'accès. Des verrous sont donc posés, même de manière transitoire. Essayez faire une lecture sale (SET TRANSACTION READ UNCOMMITTED ou NOLOCK).

    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/ * * * * *

  4. #4
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Points : 134
    Points
    134
    Par défaut
    Bonjour,

    Merci pour vos solutions rapides et précises.
    Je vais essayer cette lecture "sale" pendant la phase de développement de la solution plus propre du parcours d'indexes isolés (nécessite une procédure de lecture différente).

    J'éditerai ce message pour en donner le résultat, mais je pense que ces solutions permettent de mettre ce sujet à résolu.

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

Discussions similaires

  1. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17
  2. [jeu]problème de performance d'un algo
    Par le Daoud dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 30/05/2005, 16h07
  3. [C#] Probléme de performance avec IsDbNull
    Par jab dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/04/2005, 11h39
  4. [oracle 9i][Workbench]Problème de performance
    Par nuke_y dans le forum Oracle
    Réponses: 6
    Dernier message: 03/02/2005, 17h38
  5. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18

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