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 :

mettre un index dans ma base de données


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 89
    Par défaut mettre un index dans ma base de données
    Bonjour,

    Tout d'abord meilleurs voeux pour cette nouvelle année.

    Voilà mon souci :

    Je développe une application web ASP avec VB et SQL Server 2005 ou je dois afficher des courbes et des tableaux de données provenant de ma base avec Crystal Report

    Maintenant je voudrais mettre un index sur ma base de données et je ne sais pas vraiment où le mettre


    Voici le script de création de la table :


    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
     
    create table trancheHoraire
     
    (
     
    IdTrancheHoraire tinyint not null primary key identity(1,1),
     
    libelleTrancheHoraire char(11) not null,
     
    heureMini smallDateTime not null,
     
    heureMaxi smallDateTime not null 
     
    )
     
    Create table typeMachine
     
    (
     
    IdTypeMachine tinyint not null identity(1,1) primary key,
     
    libelleTypeMachine varchar(5) not null,
     
    numRecetteMini int not null,
     
    numRecetteMaxi int not null
     
    ) ; 
     
    Create table Etablissement
     
    (
     
    codeEtablissement char(8) not null primary key,
     
    libelleEtablissement varchar(20) not null,
     
    ) ; 
     
    Create table Categorie
     
    (
     
    codeCategorie tinyint not null primary key identity(1,1),
     
    libelleCategorie varchar(20) not null,
     
    ) ;
     
    Create table ModePaiement
     
    (
     
    codeModePaiement char(2) not null primary key ,
     
    libelleModePaiement varchar(20) not null,
     
    ) ;
     
    Create table PointVente
     
    (
     
    IdPointVente tinyint primary key not null identity(1,1),
     
    codeUNI varchar(6) not null ,
     
    libellePointVente varchar(50) not null,
     
    codeEtablissement char(8) null foreign key references Etablissement(codeEtablissement), 
     
    codeCategorie tinyint null foreign key references Categorie(codeCategorie), 
     
    ) ;
     
    create table ligne
     
    (
     
    IdMachine tinyint not null,
     
    dateTransaction smallDateTime not null,
     
    decision char(1) not null,
     
    codeModePaiement char(2) not null foreign key references ModePaiement(codeModePaiement),
     
    nbDossiers tinyint not null,
     
    sommeTransaction smallmoney not null,
     
    IdPointVente tinyint not null foreign key references PointVente(IdPointVente),
     
    trancheHoraire tinyint not null foreign key references trancheHoraire(IdTrancheHoraire),
     
    IdTypeMachine tinyint not null foreign key references typeMachine(IdTypeMAchine)
     
    );
    J'ai le gros de mes données dans la table ligne (plus de 3 millions) et je fais les requêtes sur cette table

    Je pensais le mettre sur la colonne IdPointVente, vous en penses quoi ?

    Si je dois le mettre sur cette colonne je dois le mettre sur la table ligne ou sur la table PointVente ?

    Est ce qu'il faut que je le crée avant d'insérer mes données ou alors je peux le créer meme si mes données ont été inserees ?

    Dernière question :

    Quel est la différence entre un index clusterise et un index non clusterise ? Lequel dois je utilise ?

    Merci d'avance !

  2. #2
    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 : 43
    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 et bonne année à vous aussi

    Commençons par le commencement : la différence entre un index cluster et un index non-cluster

    Dès lors vous comprenez que (presque) toutes les tables devraient avoir un index cluster, surtout lorsque vous avez l'intention d'y poser également des index non-cluster.
    C'est ce que fait implicitement SQL Server lorsque vous ajoutez une contrainte de clé primaire à une table (index cluster) ou une contrainte d'unicité (index non-cluster).

    Nous ne pourrons pas vraiment vous guider sur le moyen de spécifier vos index tant que nous ne connaissons pas les requêtes ni la façon dont sont utilisées vos tables (quasi exclusivement en lecture seule, ou bien sont-elles la cible d'un grand nombre de mises à jour ?)

    Toute pose d'index doit être mesurée par le gain qu'elle procure à la requête à optimiser et par ce qu'elle peut engendrer comme coûts de mise à jour aux requêtes de même type. Cela se fait à l'aide de l'option de session SET STATISTICS IO qui vous montre le nombre de pages lues par la requête pour chaque table spécifiée dans la requête.
    On mesure le gain obtenu en exécutant, dans votre cas, la requête avec SET STATISTICS IO ON, sans avoir posé l'index, puis en le posant et en réexcutant la requête pour pouvoir comparer le nombre de pages lues.

    Il se peut également qu'un nouvelle expression de la requête procure de meilleures performances.

    @++

  3. #3
    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
    Commencez par mettre un index sur TOUTES les clefs étrangères.
    Ensuite regardez toutes les colonnes qui servent de filtre aux requêtes et indexez les.
    Lisez cet article sur le sujet : http://sqlpro.developpez.com/cours/quoi-indexer/

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

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 89
    Par défaut
    Tout d'abord merci de votre aide !!

    Mon application me permet à partir de ma base de données d'afficher des courbes et des statistiques à l'aide de crystal report et ASP!

    Alors les colonnes qui me servent de filtre sont dateTransaction (je choisi le jour de la semaine), IdPointVente pour la table ligne et une jointure entre la table ligne et la table trancheHoraire par l'intermediaire de IdTrancheHoraire pour afficher libelleTrancheHoraire.

    Je n'ai pas de clé primaire sur la table ligne car aucune des colonnes n'est unique.

    Sur mes cles etrangeres je met un seul index avec toutes les colonnes ou alors un index par colonne.
    Est ce que je met un index ordonne ou non ordonne ?

    Comment fait on pour afficher le nombre de pages lues ?

    Merci d'avance

    Comm

  5. #5
    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 : 43
    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
    Je n'ai pas de clé primaire sur la table ligne car aucune des colonnes n'est unique.
    Mais est-ce qu'une combinaison de celles-ci est unique ?
    Sinon ajoutez par exemple une colonne de type entier avec la propriété d'auto-incrémentation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE maTable
    ADD maColonne INT NOT NULL IDENTITY CONSTRAINT PK_maTable PRIMARY KEY
    Sur mes cles etrangeres je met un seul index avec toutes les colonnes ou alors un index par colonne.
    Comme je vous l'ai dit, cela dépend de vos requêtes.
    Faites ce que vous propose SQLPro dans un premier temps, et lisez le lien qu'il vous a proposé : c'est un excellent point de départ

    Comment fait on pour afficher le nombre de pages lues ?
    Dans votre fenêtre de requête sous SSMS:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SET STATISTICS IO ON
    GO
     
    maRequête
    Et exécutez le tout.
    Vous obtiendrez le résultat de la requête, et le nombre de pages lues par table dans l'onglet Messages.

    @++

Discussions similaires

  1. Mettre des images dans une base de donnée
    Par hugo7 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 21/01/2009, 18h46
  2. Réponses: 3
    Dernier message: 11/02/2008, 10h05
  3. Tester l'existence d'un index dans une base de données
    Par QuickSave dans le forum Bases de données
    Réponses: 4
    Dernier message: 31/01/2007, 13h41
  4. [MySQL] Mettre un booléen dans une base de donnée
    Par Viau dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 26/01/2006, 15h14
  5. Interet de mettre des fichiers dans une base de donnée
    Par Oberown dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 04/07/2005, 11h35

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