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 :

Clustered index : ralentit l'INSERT ?


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de balmeyer
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 84
    Par défaut Clustered index : ralentit l'INSERT ?
    J'ai un collègue qui soutient qu'il faut utiliser des clefs primaire en "NON CLUSTERED" pour améliorer les performences d'INSERT, dans SQL SERVER 2000.

    Je n'arrête pas de chercher, et je trouve des propos contradictoires sur ce sujet.

    exemples :


    “…SQL Server 2000 supports a maximum of 249 non-clustered indexes per table. However, it’s important to keep in mind that non-clustered indexes slow down the data modification and insertion process, so indexes should be kept to a minimum…”
    http://databases.about.com/od/sqlser...ndextuning.htm


    “…This means, if you add a clustered index to a table that is heavily inserted, updated, or deleted, you will probably need to rebuild or de-fragment the index more often than when a non-clustered index is used….”
    http://searchsqlserver.techtarget.co...239664,00.html
    Est-ce vrai pour de nombreux INSERT, pour des DELETE / INSERT ?

    Qu'en pensez-vous ? Merci par avance pour cet "arbitrage" !

  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 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Les index cluster sont fortement conseillé car il permettent de marier l'index et les données de la table en une seule structure alors que l'index heap doublonne les données.
    Cepandant il faut savoir choisir la ou les colonnes qui seront celle du classement de l'index. En effet avec des colonnes indexées du cluster qui parviennent à chaque insert en ordre aléatoire l'effort sera très important alors qu'avec une colonne monotone (au sens mathématique du terme) l'effort sera inexistant.
    C'est pourquoi l'index cluster doit en principe porter sur une coonne de type autoincrément ou horodatage.
    Si ce n'est pas le cas, il faut étudier de façon plus serré le problème, notamment avec une maintenance de l'index.
    En tous cas avoir toujours un index cluster est une bonne chose dans 95% des cas.
    Voir les travaux de Kimberly Tripp (sql skills) sur le sujet.

    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 chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Bonjour, ta question est intéressante. En effet, avoir des indexs clustered sur les clés primaires identity est recommandé la plus part du temps. Ensuite tout dépend de ta clé primaire. Si celle-ci se partage sur plusieurs champs qui ne sont pas des champs indentity alors avoir un index cluster sur un des champs peut s'avérer intéressant.

    Tu abordes le problème du tunning de base de données. Je te conseille avant de créer tes indexs, d'analyser les requêtes les plus fréquemment exécutées sur ta base de données. Quelques soient leurs types (SELECT,INSERT,UPDATE,DELETE). Après cet état des lieux de l'activité SQL de ta base, il te faut analyser les champs ayant le plus d'impact sur tes requêtes. A partir de cette étude préalable, tu pourras définir tes besoins au niveau de tes indexs.

    Je te conseillerai donc de rechercher sur le net des articles consacrés au tunning de base de données.

    Bon débat.

  4. #4
    Membre confirmé Avatar de balmeyer
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 84
    Par défaut
    Merci beaucoup pour vos réponses.

    Comme l'index clustered organise le fichier selon la donnée , je me demandais si chaque INSERT ne "bouleversait" pas à chaque fois la table, ce qui ne semble pas être le cas si la valeur est auto-incrément.

    Ce qui me surprend, c'est que dans ma table, selon le "générateur de profil" le SELECT est très rapide (peu de "read", "duration" faible), alors qu'un UPDATE ou un INSERT provoquent un grand nombre de "Reads" (dans les 500) et peu de "Writes"...

    Je me demandais alors si cela ne venait pas de l'index clustered ?

  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
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Pour insérer une ligne il faut savoir ou l'insérer dans les différents index. C'est pourauoin un insert commence par des lectures pour trouver la position de la ligne et des différentes composantes d'indexation pour savoir ou situer les données.

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

Discussions similaires

  1. SQL Server 2000:Clustered Index et Shrink
    Par bédu1 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/01/2007, 14h45
  2. Réponses: 3
    Dernier message: 25/10/2006, 17h45
  3. index ralentit requete
    Par gg14bis dans le forum Oracle
    Réponses: 14
    Dernier message: 07/09/2006, 10h49
  4. exemple de CLUSTERED INDEX
    Par big1 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 01/09/2006, 16h21
  5. clustered index en ORACLE
    Par big1 dans le forum Oracle
    Réponses: 1
    Dernier message: 01/09/2006, 12h05

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