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(*) trop long


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Par défaut count(*) trop long
    J'ai une table avec 20 millions de lignes au depart sur laquelle j'ai fais ces traitements :
    - select count(*) --> durée 1 minute, normal
    - delete de 1 millions de lignes ---> durée 5 minutes, normal
    - select count(*) --> interminable toujours en execution aprés 1 heure !!

    La table a juste une clé primaire.

    La cause est evidemment le delete en masse, mais je ne comprend pas pourquoi ?

  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
    Fragmentation de l'index...

    Commencez par défragmenter les index de cette table.

    Pour visualiser la fragmentation des index de cette table utilisez la commande DBCC SHOWCONTIG.

    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 confirmé
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Fragmentation de l'index...

    Commencez par défragmenter les index de cette table.

    Pour visualiser la fragmentation des index de cette table utilisez la commande DBCC SHOWCONTIG.

    A +
    voici le resultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Table: 'MaTable' (1982630106); index ID: 1, database ID: 41
    TABLE level scan performed.
    - Pages Scanned................................: 1111028
    - Extents Scanned..............................: 142713
    - Extent Switches..............................: 188459
    - Avg. Pages per Extent........................: 7.8
    - Scan Density [Best Count:Actual Count].......: 73.69% [138879:188460]
    - Logical Scan Fragmentation ..................: 68.81%
    - Extent Scan Fragmentation ...................: 9.77%
    - Avg. Bytes Free per Page.....................: 838.2
    - Avg. Page Density (full).....................: 89.64%

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Par défaut
    - Logical Scan Fragmentation ..................: 68.81%
    - Extent Scan Fragmentation ...................: 9.77%
    Yikes!

    Essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBCC DBREINDEX ('maTable')
    et ensuite revérifie si la fragmentation a diminué.

    *ATTENTION* ça peut prendre du temps! Ne pas faire sur une table en production!

    En passant, quel est fill factor de tes index?

    S'il y a beaucoup d'inserts et deletes sur la table, il faudra réduire le fill factor. Il faudra aussi scéduler des reindex de façon régulière.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Par défaut
    Effectivement j'ai utilisé DBCC REINDEX mais le temps d'execution est colossale, depuis hier deja 17 heures en execution est toujours pas fini !!!

    Comment faire dans ce cas ?
    La base contient des tables ou il y a autant d'operation d'ecritures que d'operation de lecture, pensez vous que changer le fill factor soit benefique ?

    Pour l'instant je travaille en environenment de dév ( meme volumetrie que celle en production ), mais je pensais faire un script regulier de recréation d'index sur les tables mais si ca met autant de temps ca ne va pas etre possible de faire ca en production !!

    Quelle strategie me conseillez vous ?

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    bonjour,

    Si tu es sous SQL Server 2005, tu peux utiliser la commande ALTER INDEX avec ses options pour défragmenter et eventuellement changer le FILLFACTOR de tes indexes.
    De plus la commande ALTER INDEX n'est pas bloquante comme une commande DBCC. Regarde la documentation sur l'option ONLINE de la commande ALTER INDEX.

    Si tu fais un SELECT COUNT(*) alors que ton DELETE n'est pas encore terminé, il est normal que tu n'aies pas le résultat du SELECT COUNT(*).
    Tu peux utiliser la vue système sys.sysindexes (avec indid = 1 (index cluster), rowcnt, et id = OBJECT_ID('MA_TABLE')) pour savoir combien de lignes sont dans ta table, c'est beaucoup plus rapide que d'utiliser la commande SELECT COUNT(*) . Tu peux également y sélectionner OrigFillFactor pour connaître la valeur du FillFactor la dernière fois qu'il a été (re)construit.

Discussions similaires

  1. count(*) trop long
    Par roda dans le forum Oracle
    Réponses: 11
    Dernier message: 06/09/2005, 15h52
  2. Mot trop long
    Par Toudy dans le forum ASP
    Réponses: 6
    Dernier message: 28/07/2004, 17h51
  3. Chargement de page trop long
    Par t_o_7_ dans le forum ASP
    Réponses: 2
    Dernier message: 19/09/2003, 18h58
  4. [TComboBox] Contenu trop long pour la zone d'affichage
    Par bebeours dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/09/2003, 16h21
  5. Arrêter un prog si temps de connexion trop long
    Par jakouz dans le forum Langage
    Réponses: 4
    Dernier message: 22/10/2002, 18h28

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