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

MS SQL Server Discussion :

Nombre de lignes retournées incohérent : table corrompue ?


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 108
    Par défaut Nombre de lignes retournées incohérent : table corrompue ?


    J'ai des résultats bizarres sur des requêtes simples. J'ai une table qui se compose de plusieurs champs dont un champ varchar(20) et un champ bit que j'utilise dans mes requêtes.

    Le champ varchar permet de restreindre les résultats. La table comporte plus de 6 millions d'enregistrements. Le champ bit permet de distinguer les lignes qui ont subi un traitement des autres. Il vaut soit NULL (non traité), soit 1 (traité).

    J'obtiens des résultats différents quand je recherche les lignes non traitées (bit is null). Les résultats varient d'une exécution à l'autre.

    Voici les requêtes testées et leurs résultats :
    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
     
    select * from ma_table where champ_varchar='valeur' 
    --29339 lignes
     
    select * from ma_table where champ_varchar='valeur' and champ_bit = 1
    --18854 lignes
     
    Ces résultats semblent corrects.
     
    select * from ma_table where champ_varchar='valeur' and champ_bit is null
    --Plusieurs résultats différents au lieu de 10485 attendu :
    --10689
    --29339
    --47217
     
    select champ_bit, count(*) from ma_table where champ_varchar='valeur' group by champ_bit
    -- NULL : 10485
    -- 1    : 18854
     
    Ce résultat semble correct.
     
    select count(*) from ma_table
    --6 319 886
    J'obtiens les mêmes résultats si je remplace les * par count(*) au lieu de regarder le nombre de lignes retournées par SQL Query Analyser.

    La table est-elle corrompue ? Si oui, comment corriger le problème et comment le repérer sur d'autres tables ? SQL Server a t-il un problème avec la gestion de "is null" ?

    Pendant mes tests, aucune modification n'a été faite en base. Les données sont fixes.

    J'utilise SQL Server 2000 sous Windows 2000 Server.

    Merci de votre aide !

  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
    21 999
    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 999
    Billets dans le blog
    6
    Par défaut
    commencez par vous assurer d'être au bon niveau d'isolation des transactions en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SET TRANSACTION ISOLATION SERIALIZABLE
     
    ... mes requêtes ...
     
    SET TRANSACTION ISOLATION READ COMMITTED
    Ensuite postez nous les vrais requêtes effectuée avec le DDL des tables en jeu.

    Enfin, pour savoir si une table est corrompue, faites :
    DBCC CHECKTABLE (...)

    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
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Non, il n'y a pas de problème de gestion des NULL en SQL Server 2000 ou autre version. Ton code a l'air correct, et si les données sont fixes, le niveau d'isolation n'entre pas en ligne de compte. Il reste le champ_varchar='valeur' qu'il faut vérifier. Sûr qu'il est le même ?

  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 999
    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 999
    Billets dans le blog
    6
    Par défaut niveau d'isolation
    http://www.developpez.net/forums/d98...e/#post5498025

    Si cela peut jouer si sa session est en READ UNCOMMITTED !

    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 confirmé
    Inscrit en
    Septembre 2003
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 108
    Par défaut
    Merci pour vos réponses.

    Pas d'amélioration avec SET TRANSACTION ISOLATION SERIALIZABLE.
    La table incriminée a été copiée dans une nouvelle table. Les requêtes sont correctes dans cette table.

    DBCC CHECKTABLE ne renvoie aucune erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Résultats DBCC pour 'CBDRPAYLINE'.
    Il y a 6319886 lignes dans 101040 pages pour l'objet 'CBDRPAYLINE'.
    Exécution de DBCC terminée. Si DBCC vous a adressé des messages d'erreur, contactez l'administrateur du système.
    Je ne pense pas que ça fasse avancer les choses, mais voici quand même les vraies requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT * FROM cbdrpayline WHERE cbdrpayline_fichier='RPA_20100714_015917' 
     
    SELECT * FROM cbdrpayline WHERE cbdrpayline_fichier='RPA_20100714_015917' AND cbdrpayline_remis = 1
     
    SELECT * FROM cbdrpayline WHERE cbdrpayline_fichier='RPA_20100714_015917' AND cbdrpayline_remis IS NULL
     
    SELECT cbdrpayline_remis, count(*) FROM cbdrpayline WHERE cbdrpayline_fichier='RPA_20100714_015917' GROUP BY cbdrpayline_remis
    Et le DDL :
    Champ Type Longueur Null
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CBDRPAYLINE_ID	numeric	5	0      
    CBDRPAYLINE_CR	varchar	20	1    
    CBDRPAYLINE_TPE	varchar	25	0    
    CBDRPAYLINE_REF	varchar	50	0    
    CBDRPAYLINE_DTDA	datetime	8	1  
    CBDRPAYLINE_DTDR	datetime	8	1  
    CBDRPAYLINE_AUT	varchar	6	1      
    CBDRPAYLINE_MNT	numeric	5	0      
    CBDRPAYLINE_PORTEUR	varchar	19	1
    CBDRPAYLINE_REFPAYL	numeric	9	1  
    CBDRPAYLINE_REMIS	bit	1	1        
    CBDRPAYLINE_FICHIER	varchar	20	1

  6. #6
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Ben, pour voir, envoie le DDL complet, index et contraintes comprises, des deux tables. Celle qui ne "marche" pas, celle qui "marche".

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 108
    Par défaut
    Il semble que l'index soit corrompu. Il y a en effet un index sur le champ bit. En le supprimant, on obtient les bons résultats. Y'a t-il possibilité de le corriger ou de repérer les index corrompus ?

  8. #8
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Un index sur une colonne de type BIT avec une distribution telle qu'on la voit dans tes requêtes et inutile, aucune sélectivité de l'index.

    Un DBCC CHECKTABLE vérifie les index de la table, sauf si tu utilises l'option NOINDEX.

  9. #9
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Y'a t-il possibilité de le corriger ou de repérer les index corrompus ?
    En reconstruisant l'index (s'il est utile...)?


    ALTER INDEX [nomindex] ON [tableName] REBUILD par exemple

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/04/2006, 11h22
  2. [JDBC] Nombre de lignes retournés
    Par raj dans le forum JDBC
    Réponses: 4
    Dernier message: 29/12/2005, 15h03
  3. nombre de lignes d'une table de ma BD
    Par manikou dans le forum MFC
    Réponses: 4
    Dernier message: 06/07/2005, 10h04
  4. Réponses: 8
    Dernier message: 20/06/2005, 15h10
  5. determination le nombre de ligne d'une table
    Par picoti2 dans le forum Bases de données
    Réponses: 2
    Dernier message: 18/03/2004, 09h25

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