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 :

Question optimsation (index)


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Par défaut Question optimsation (index)
    Bonjour,

    J'ai un site sur lequel il y a pas mal de traffic.
    Sur chaque page, j'insère des données dans une table. Les infos que je stocke sont (entre autres): l'ip du visiteur, un numéro qui correspond à la page et un numéro qui correspond au referer (site qui a envoyé le visiteur).

    Cela représente des données très volumineuses.
    Afin d'établir des stats, je suis amené à faire de manière reguliere des select sur cette table.
    Le select porte sur l'ip, mais aussi sur les différents numéros (N° de referer, N° de la page, etc.)

    Si je lit mot pour mot la litterature, je vois qu'il faut faire un index multiple sur l'ensemble des champs qui interviennent dans le where.

    Dans mon cas, cela conduit à générer un index assez lourd car il existe beaucoup de combinaisons d'ip/referer/pages.

    Je remarque que pour une ip donnée, il y a finalement peu d'enregistrements.

    Je serais tenté de placer un index juste sur l'ip du coup...

    Est ce que quelqu'un peut me donner son avis sur la question ?

    D'avance Merci

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonsoir,

    Un index sera d'autant plus performant qu'il sera sélectif.
    Effectivement mettre un index sur l'ip peut être une bonne chose à voir.

    Tout dépend ensuite comment vous filtrez dans la clause WHERE, il faudra sûrement ajouter certaines colonnes.

    Si votre index est trop lourd, il vous reste la possibilité d'inclure certaines colonnes dans votre index... possible avec SQL Server 2005

    ++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Par défaut
    Justement, c'est ma question ! Est ce qu'il faut que je fasse un index multiple !

    Mon where est hyper simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from tableStats where adresseIp='x.x.x.x' and numeroReferer=5 and numeroPage=10
    Je résume ma question:

    Est ce que je fait un index multiple sur (adresseIp, numeroReferer, numeroPage) ?
    Ou bien un index simple uniquement sur (adresseIp).

    Sachant que : donnée essentielle : pour une IP donnée il n'y a pas beaucoup d'enregistrements (on va dire une cinquantaine en moyenne alors que la table en contient plusieurs dizaine de milliers...)

    D'avance Merci !

  4. #4
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Vous historisez donc vos logs.

    Dites moi si je me trompe mais dans ce cas vous allez avoir beaucoup d'enregistrements pour une IP au bout d'un certain temps.. Vous allez également avoir un critère de date je suppose ... ou est ce que vous videz cette table ou bout d'un certain laps de temps ??

    Pouvez vous nous en dire plus sur la structure de votre table tableStats ?

    Quoi qu'il en soit, si dans votre SELECT * (A éviter), vous ne récupérez que les informations contenus dans la restricition de votre requête, il est intéressant de mettre dans votre index toutes les colonnes concernés par cette restriction. Dans le cas contraire, même si vous allez utiliser votre index, étant donné que celui-ci ne contiendra pas toutes les informations nécessaires il devrait faire une recherche par clés dans votre table.. donc mois performant ...

    ++

  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
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Avez vous une clef primaire dans cette table ?
    Si oui, est-elle cluster ??
    Si non, il serait intéressant de faire un index cluster sur la combinaison adresseIp, numeroReferer, numeroPage mais dans ce cas :
    1) mettre un fill factor assez important (tout dépend du nombre d'insertion par jour par rapport au volume de la table)
    2) ré indexer cette table une fois par jour aux heures creuses.

    Donnez nous le script complet de votre table contraintes comprises, le volume de données actuel (sp_spaceused 'matable') et le nombre moyen de ligne inséré par jour.

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

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Par défaut
    Cette table est en fait vidée a intervalle régulier (tout ce qui a plus de x heures) donc le nombre d'enreg par IP reste le même.

    Il n'y a pas de clef primaire.

    Je dit peut être une connerie, mais l'idée de mettre un index cluster sur tous les champs me fait peur: ça va créer un index immense et sql server va être hyper chargé pour construire ces index (qqsoit la valeur du fill factor).

    D'ou l'idée de faire un index simple sur IP...

Discussions similaires

  1. Question analyse index
    Par pinocchio dans le forum Débuter
    Réponses: 4
    Dernier message: 02/02/2012, 16h02
  2. Question optimisation - index
    Par boby62423 dans le forum Développement
    Réponses: 11
    Dernier message: 20/02/2011, 19h04
  3. Questions sur Index
    Par bibette dans le forum SAS Base
    Réponses: 1
    Dernier message: 07/07/2008, 15h26
  4. Question sur index DB2 400
    Par Jibon dans le forum DB2
    Réponses: 4
    Dernier message: 19/08/2007, 16h58
  5. [débutant] questions - regroupement indexes et jobs ?
    Par nagty dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/07/2005, 08h17

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