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 :

Problème de plan SQL Server 2022


Sujet :

Administration SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Par défaut Problème de plan SQL Server 2022
    Bonjour à tous,

    J'utilise en Production une base de données sur SQL Server 2022.
    Malheureusement de façon aléatoire (2 fois par mois environ), certaines requêtes (surtout une) sont très longues.
    J'ai pu identifier grâce au "Query Store" que le "plan" avait changé.
    SQL Server a subitement choisi d'utiliser un autre index.
    Le plan de maintenance fonctionne correctement (j'utilise Ola Hallengren), mes index ne sont pas fragmentés, mes statistics sont en FULL SCAN.
    Pour résoudre le problème de façon rapide, j'ai forcé le bon plan, mais j'aimerai bien trouver la raison de ce changement.

    Le hasard fait que j'ai aussi le même problème quand j'utilise "Top Resource Consuming Queries" dans le "Query Store".
    Du coup j'ai aussi forcé le plan pour 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
    SELECT TOP (@results_row_count)
        p.query_id query_id,
        q.object_id object_id,
        ISNULL(OBJECT_NAME(q.object_id),'') object_name,
        qt.query_sql_text query_sql_text,
        ROUND(CONVERT(float, SUM(rs.avg_duration*rs.count_executions))*0.001,2) total_duration,
        SUM(rs.count_executions) count_executions,
        COUNT(distinct p.plan_id) num_plans
    FROM sys.query_store_runtime_stats rs
        JOIN sys.query_store_plan p ON p.plan_id = rs.plan_id
        JOIN sys.query_store_query q ON q.query_id = p.query_id
        JOIN sys.query_store_query_text qt ON q.query_text_id = qt.query_text_id
    WHERE NOT (rs.first_execution_time > @interval_end_time OR rs.last_execution_time < @interval_start_time)
    GROUP BY p.query_id, qt.query_sql_text, q.object_id
    HAVING COUNT(distinct p.plan_id) >= 1
    ORDER BY total_duration DESC
    Quelqu'un a une idée de ce que je peux vérifier ?
    Merci
    A+

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 010
    Billets dans le blog
    6
    Par défaut
    Sans le contexte impossible de savoir. Cela peut être un défaut de statistiques. Par exemple si vous insérez des données dans une table avec la date du jour (qui n'existait pas jusqu'alors) et que vous faites un traitement sur ces lignes à ce moment là, alors l'optimiseur va en conclure qu'il n'existe pas de ligne à cette date et faire un plan optimisé pour une seule ligne, alors qu'il est possible que le nombre de lignes nouvelle soit de plusieurs milliers...

    Nous ne savons pas si votre base est en rétrocompatibilité, si les stats sont activées en mode auto-update, si vous êtes en édition Enterprise...

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

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Par défaut
    Bonjour SQLpro,

    Je suis en Standard edition.
    La base est en version 160 (2022).
    L'auto-update des statistics est activé.

    L'application fait une requête sur une seule table mais en boucle.
    Quand il prend l'index1 en quelques secondes le traitement est terminé, par contre avec l'index2, le traitement peut durer 40min...
    Comment je peux déterminer pourquoi aujourd'hui il va utiliser l'index1 et un jour l'index2 ?
    Je suis preneur de piste de recherche...

    Merci
    A+

  4. #4
    Membre chevronné Avatar de licardentaistor
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2021
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

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

    Informations forums :
    Inscription : Juillet 2021
    Messages : 346
    Par défaut
    quelle est la requête en question, comment est construit index1, index2 ?

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 010
    Billets dans le blog
    6
    Par défaut
    Cela peut être lié avec "L'auto-update des statistics est activé."

    En effet, ce dernier ne peut agir en mode, FULLSCAN.

    vérifiez les date/heure des requêtes fautives et des recalculs de stats...

    Si tel est le cas, le forçage via querystore est une bonne chose...

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

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Par défaut
    Voici la requête en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Select CPT.ROWID, CPT.*
    From CPTDETAIL CPT
    Where CPT.ACCOUNT = @P1 And CPT.TIERS = @P2 And CPT.SOCIETE = @P3 And CPT.CHECK = @P4
    Order by CPT.TYP,CPT.ACCOUNT,CPT.TIERS,CPT.SOCIETE,CPT.DATE,CPT.ID
    Option (FAST 1)

    Et voici les 2 index :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE NONCLUSTERED INDEX [CPT_INDEX1] ON [CPTDETAIL] (
    	[CHECK] ASC,	[ACCOUNT] ASC,	[TIERS] ASC,	[SOCIETE] ASC,	[DATE] ASC,	[ID] ASC )
     
     
    CREATE UNIQUE NONCLUSTERED INDEX [CPT_INDEX2] ON [CPTDETAIL] (
    	[TYP] ASC,	[ACCOUNT] ASC,	[TIERS] ASC,	[SOCIETE] ASC,	[DATE] ASC,	[ID] ASC )

    Quant l'optimiseur utilise que l'index1 c'est très rapide.
    Nom : index1.jpg
Affichages : 183
Taille : 36,7 Ko

    Quand l'optimiseur utilise que l'index2 c'est très lent.
    Nom : index2.jpg
Affichages : 180
Taille : 15,7 Ko

    Il s'agit d'une grosse table.
    Il n'y a pas ou peu de ligne inséré entre l'exécution du plan de maintenance (en FULL SCAN pour les stats) et l'exécution de la requête.
    Je vais voir pour tracker les mises à jour de ces stats.

Discussions similaires

  1. Problème de connexion SQL Server 2005
    Par kanko dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/02/2006, 17h14
  2. Problème de connection à SQL Server
    Par wsangli dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 12/08/2005, 17h19
  3. [VB.NET] Problème de connexion à SQL Server
    Par Nesmontou dans le forum ASP.NET
    Réponses: 8
    Dernier message: 29/07/2005, 10h12
  4. Problème Access to Sql Server
    Par vuldos dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/08/2004, 15h56
  5. Réponses: 3
    Dernier message: 18/11/2002, 16h36

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