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 :

Count(*) qui prend plus de 7h dans Management Studio


Sujet :

MS SQL Server

  1. #1
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut Count(*) qui prend plus de 7h dans Management Studio
    Bonjour,

    ce post se veut un complément d'un souci de timeout consultable ici.

    Sur mon serveur B, j'ouvre management studio, lui demande de faire un count(*) sur les tables qui me génèrent des time out, et il lui a fallu 7h pour me dire qu'il y a 600 000 lignes pour une des tables (et "seulement" 40mn pour l'autre table doté de 150 000 lignes).

    Qu'est-ce qui peut être à l'origine de ce phénomène ?

    Info : la base de données est dans une réplication P2P mais les tables que je vise ne sont pas répliquées...

    Merci

  2. #2
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Il se peut que vous ayez des soucis liés au matériel, monitorez vos disques, le CPU et la mémoire avec perfmon et voyez si votre serveur n'est pas surchargé ou si un de ses composant n'est pas défaillant.

    Pensez aussi à regarder l'exécution plan de votre requete.

    Vous pouvez aussi songer à analyser les locks sur vos tables. Si une transaction bloque la table pendant 7h... Ca crée une certaine latence ^^

  3. #3
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Cela ne résolvera absolument pas le problème, mais pensez à utiliser plutôt ce genre de script pour connaître le nombre de lignes
    Alexandre Chemla - Consultant MS BI chez Masao

  4. #4
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Vous pouvez aussi penser à limiter le count à votre clef primaire:
    select count(ColonnePK1[, ColonnePK2,...,ColonnePKN]) from MaTable.

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Bonjour,

    merci pour la réponse.

    CPu et ram hors de cause, on a changé le serveur il y a peu. Des disques défaillants pourraient entrainer ce type de souci ?

    Il peut y avoir un facteur logique (paramétrage sql server) influençant cet état de fait ?

    --

    Edit : autres options que count(*) impossible... Ici c'est pour montrer un état de fait très bizarre, mais je l'utilise ailleurs pour calculer un volume de données à afficher, avec moults union et conditions :p

    Merci

  6. #6
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Citation Envoyé par Arnard Voir le message
    CPu et ram hors de cause, on a changé le serveur il y a peu. Des disques défaillants pourraient entrainer ce type de souci ?
    Avez vous effectuez des stress tests sur votre nouveau matériel ?
    Nouveau ne devrait en théorie pas rimer avec défectueux...Cependant on ne sait jamais.

    Des disques défaillants ou ne supportant juste pas la charge demandée peuvent effectivement jouer dans ce problème.
    Vérifiez la disk queue lenght de vos disques data/logs.

    Si vous effectuez la commande à partir d'un poste de travail et que cela prend tant de temps alors que la meme commande executée sur le serveur retourne les résultats de manière plus rapide, pensez à jeter un oeil au réseau.

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    PerfMon m'affiche pour le disque physique
    - zigzag continue de 10 à 100 pour Ecriture disque ainsi que Moyenne Disque octets/ecriture
    - Zigzag continue de 5 à 50 pour Transfert Disque/s
    - Zigzag continue de 10 à 60 pour Moyenne Disque octets/Transfert
    - Continue à 100 pour Ecriture Disque octetcs/s

    Jamais utilisé perfmon, donc je ne sais pas si ces résultats sont corrects ou non, je néglige les autres.

    Pour les disques logiques, gros dawa impossible à lire, savoir sur quoi filtrer me serait utile

    Je suspecte les disques, car on avait des soucis avec l'ancienne machine, et tout a été changé, sauf les disques, et ça donnait l'impression de mieux tourner... Jusqu'à maintenant...

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 739
    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 739
    Points : 52 451
    Points
    52 451
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Jinroh77 Voir le message
    Cela ne résolvera absolument pas le problème, mais pensez à utiliser plutôt ce genre de script pour connaître le nombre de lignes
    Atttention :cette technique ne donne pas toujours un nombre EXACT de ligne, car les données de ces vues ne sont pas synchrones...

    Voir le nombre d'objet en moyenne dans la file d'attente des disques. Mais cela n'est à mon sens aucunement la cause de votre problème ! Les données d'une table sont lues en mémoire pas depuis le disque....

    Mais la raison d'un count(*) qui prend du temps est généralement lié à des verrous. Pour compter il faut verrouiller TOUTE la table, ce qui veut dire qu'aucun accès en écriture ne doit se faire le temps du comptage.

    Essayez la syntaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) FROM MaTable WITH (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/ * * * * *

  9. #9
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    En effet, le nolock s'avère salutaire
    Par contre je souhaiterai l'utiliser dans un count particulier de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select count(*) from (
        select Code from base1.Table Where ....
        Union select Code from base2.Table Where ....
    ) As Res
    Je tente de rajouter le nolock sans résultat, comment puis-je procéder ?

    --

    edit : ai trouvé grâce à l'un de tes tutos

    Question de curiosité : s'il n'y a pas de verrou et qu'un insert est fait en même temps que le select count(*), faut-il seulement s'attendre à un résultat non juste, ou un destin plus tragique m'attend ?

    edit2 : Qu'en est-il dans le cas d'Insert/Delete ? Retrouve-t-on aussi des verrous ? ou cela est propre aux select ?

    Merci

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 739
    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 739
    Points : 52 451
    Points
    52 451
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Arnard Voir le message
    Question de curiosité : s'il n'y a pas de verrou et qu'un insert est fait en même temps que le select count(*), faut-il seulement s'attendre à un résultat non juste, ou un destin plus tragique m'attend ?
    Votre résultat ne prendra pas en compte les mises à jour. C'est tout.

    Citation Envoyé par Arnard Voir le message
    edit2 : Qu'en est-il dans le cas d'Insert/Delete ? Retrouve-t-on aussi des verrous ? ou cela est propre aux select ?
    NOLOCK (qui en fait implémente le mode d'isolation READ UNCOMMITTED) ne peut être utilisé que pour de la lecture. Il n'a aucun effet sur les mises à jour, car pour mettre à jour il faut TOUJOURS poser des verrous !

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

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

Discussions similaires

  1. Procédure stocké qui prend plus de 20s pour s'exécuter
    Par joujousagem2006 dans le forum Administration
    Réponses: 3
    Dernier message: 04/03/2014, 11h38
  2. Update qui prend plus de 7h !
    Par Battosaiii dans le forum SQL
    Réponses: 14
    Dernier message: 13/09/2011, 17h44
  3. Impression qui prend plus qu'une page
    Par TrollTop dans le forum C++/CLI
    Réponses: 2
    Dernier message: 29/05/2009, 10h45
  4. Grand tableau qui prend plus d'une page
    Par Rabie de OLEP dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 1
    Dernier message: 03/01/2007, 23h22
  5. Qu'est ce qui prend de la place dans une db access
    Par lepirlouit dans le forum Access
    Réponses: 8
    Dernier message: 25/07/2006, 11h19

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