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 :

Comportement incohérent d'un count()


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Octobre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Octobre 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Comportement incohérent d'un count()
    Bonjour à tous,
    j'espère que je suis dans la bonne catégorie pour ce sujet.

    Je constate un problème assez déroutant sur une requête toute simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(1) from myTable where someField = 46
    retourne "56221"

    mais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from myTable where someField = 46
    retourne 3997 lignes

    voilà le plan d'exécution :
    Nom : capture1.png
Affichages : 187
Taille : 21,5 Ko

    Nom : capture2.1.png
Affichages : 207
Taille : 52,1 Ko

    Je ne vois pas comment un simple count() peut renvoyer un résultat erroné.

    J'ai testé de faire un rebuild et un reorganize de l'index, pas mieux.

    La seule façon d'avoir le bon 'count' est de forcer l'utilisation d'un autre index (via un hint)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select count(1) from myTable with(index= anotherIndex) where someField = 46
    retourne "3997"

    Nom : capture3.1.png
Affichages : 205
Taille : 55,2 Ko

    A toute fin utile, voilà le script de création de l'index

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE NONCLUSTERED INDEX [IX_myTable] ON [myTable]
    (
    	[SomeField] ASC,
    	[AnotherField] ASC
    )
    INCLUDE ( 	[Field1],
    	[Field2],
    	[Field3],
    	[Field4]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 70) 
    GO
    Je suis en version Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64)

    Quelqu'un a déjà eu ce genre de problèmes ?

    Merci !

    PS : le champ "SomeField" est en int nullable mais ne contient aucune valeur NULL dans la table.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    C'est très suspect... je commencerais par un DBCC CHECKDB pour vérifier l'intégrité de la base.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Octobre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Octobre 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    merci pour la suggestion.
    Je vais tester ça. Je vous tiens au courant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DBCC CHECKDB WITH PHYSICAL_ONLY;
    GO
    DBCC results for 'xxxxx'.
    CHECKDB found 0 allocation errors and 0 consistency errors in database 'xxxxx'.

    Avec l'option "WITH PHYSICAL_ONLY", le dbcc checkdb ne détecte rien d'anormal.
    Je retenterai un FULL durant la nuit mais ça met un peu le serveur à genou.

  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
    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
    Ne seriez vous pas en READ UNCOMMITED ? (ou NOLOCK ce qui est la même 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/ * * * * *

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 674
    Points
    674
    Par défaut
    Bonjour,

    J'ai déjà rencontré un probleme similaire sur une version SP1 de SQL Server 2016 sur un columnstore index...

    J'ai du passé le SP2 ou un CU pour remedier au probleme.

    Le problème était que dans les statistiques le nombre de lignes étaient erronés par rapport au données stockées même en réalisant un update stat cela ne fonctionnait pas ...

    En reconstruisant l'index non plus ...


    Puis j'ai cherché un peu :

    https://littlekendra.com/2017/01/17/...mnstore-index/

    https://support.microsoft.com/en-us/...-in-sql-server

    A+
    MCSA SQL SERVER |MCT | MVP Data Platform

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Octobre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Octobre 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Effectivement le dbcc check complet renvoie des millions d'erreurs sur cette table:

    Table error: table 'xxxxxxxxxxxx' (ID 1399857691). Index row in index 'monIndex' (ID 4) does not match any data row. Possible extra or invalid keys for:
    Msg 8956, Level 16, State 1, Line 1
    Index row (3:5148009:89) with values (yyyyyyyyyyyyyyyyyy) pointing to the data row identified by (id = 1103493).
    Msg 8952, Level 16, State 1, Line 1

    Je vais en programmer un sur tous nos environnements.
    Je vais aussi voir pour planifier le passage en SP2.

    Je reste quand même surpris qu'un rebuild d'index ne soit pas suffisant.

    Merci à tous pour vos réponses !

  7. #7
    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
    Citation Envoyé par Maxime_Gendre Voir le message
    Effectivement le dbcc check complet renvoie des millions d'erreurs sur cette table:

    Table error: table 'xxxxxxxxxxxx' (ID 1399857691). Index row in index 'monIndex' (ID 4) does not match any data row. Possible extra or invalid keys for:
    Msg 8956, Level 16, State 1, Line 1
    Index row (3:5148009:89) with values (yyyyyyyyyyyyyyyyyy) pointing to the data row identified by (id = 1103493).
    Msg 8952, Level 16, State 1, Line 1
    Le DBCC CHECK.. doit être effectué à la même fréquence que les sauvegardes complètes sur toutes les bases de production et sur les bases master, model et msdb.


    En général ceci indique une corruption du stockage. Donc la première mesure est de déplacer le stockage de la base et de retirer le ou les disques fautifs.

    Après lisez l'article que j'ai écrit pour les méthodes de réparation :
    https://blog.developpez.com/sqlpro/f...corrompues.pdf

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

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Octobre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Octobre 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Le DBCC CHECK.. doit être effectué à la même fréquence que les sauvegardes complètes sur toutes les bases de production et sur les bases master, model et msdb.


    En général ceci indique une corruption du stockage. Donc la première mesure est de déplacer le stockage de la base et de retirer le ou les disques fautifs.

    Après lisez l'article que j'ai écrit pour les méthodes de réparation :
    https://blog.developpez.com/sqlpro/f...corrompues.pdf

    A +
    En fait, il est bien schedulé quotidiennement mais avec l'option "WITH PHYSICAL_ONLY".
    Ça ne semble cependant pas suffisant. Je vais en parler à notre DBA.
    Merci pour l'article, il a l'air très complet.

  9. #9
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 674
    Points
    674
    Par défaut
    Pour info avant la mise en place du SP2, la seul méthode permettant de corriger le problème était la suppression et la reconstruction d'index.

    Comme l'a dit SQLpro , il faut vérifier le stockage mais jetez un œil du coté du SP2 également ça ressemble fortement au bug
    MCSA SQL SERVER |MCT | MVP Data Platform

Discussions similaires

  1. Optimisation requête comportant plusieurs Count
    Par arychener dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/07/2013, 17h56
  2. Requête sql UPDATE comportant 1 SELECT + 1 AVG + 1 COUNT
    Par tomazawak dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/10/2009, 16h38
  3. Problème Gridview/Update : comportement incohérent
    Par mask_66 dans le forum VB.NET
    Réponses: 0
    Dernier message: 13/05/2009, 17h08
  4. Réponses: 2
    Dernier message: 20/09/2007, 19h12
  5. [9.2 PL/SQL] incohérence de comportement
    Par Yorglaa dans le forum SQL
    Réponses: 9
    Dernier message: 30/10/2006, 09h12

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