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 optimisation - 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 optimisation - index
    Bonsoir,

    J'ai une table nommée tableA qui comporte deux champs ip1 et ip2 au format Long. Il s'agit d'adresses IP converties en Long. Cette table comporte également un champ info.
    Je voudrais faire une requête sur ce modèle pour alimenter un autre champ info pour toute la table TableB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    update TableB
       set TableB.info = (select top 1 TableA.info
                            from TableA
                           where TableB.ip >= TableA.ip1
                             and TableB.ip <= TableA.ip2)
     where TableB.info is null;
    Mes questions sont les suivantes: je voudrais créer un index cluster sur les champs (ip1,ip2). Est-ce une bonne solution compte tenu du fait que je vais faire une sélection par comparaison ?

    La forme de requête imbriquée est elle un choix pertinent ? Les tables tableA et tableB vont comporter en effet un grand nombre d'enregistrements...

    D'avance merci pour vos réponses !

  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
    22 010
    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 010
    Billets dans le blog
    6
    Par défaut
    Le type "LONG" n'existe ni pour SQL Server ni dans la norme SQL ! De quoi parlez vous ? Soyez clair !!!

    Il n'y a pas d'enregistrement dans les tables, mais des lignes et "un grand nombre d'enregistrements" ne veut rien dire... Quelle volumétrie : 1 Go, 10 Go, 100 Go dans la table ?

    Enfin quel est l'intérêt de dupliquer les informations ? En principe dans une base de données relationnelle aucune information ne doit être redondante sauf les valeurs des clefs étrangères, ou sauf cas fortuit ! Plutôt que de faire un update pourquoi ne pas faire une vue ?

    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é
    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
    Pardon, je me suis mal exprimé.

    Je ne voulais pas parler de Long mais de BigInt.

    Impossible de faire une clef étrangère entre tableA et tableB puisque la relation entre les champs info se fait sur une plage et non sur une correspondance de valeurs. Ce point est peut être discutable. Perso ça me choque un peu de faire un join avec un intervalle comme condition de jointure, non ? Dans ce cas aussi il faudra que je créé un index cluster sur les champs ip1 et ip2, c'est pareil ?
    J'imagine que votre suggestion de vue c'est de faire un select avec jointure entre tableA et tableB dans cette vue ?
    De toutes façon, d'un point de vue fonctionnel, je suis obligé d'alimenter le champ info de la table tableB.

    Merci

  4. #4
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    d'un point de vue fonctionnel
    HUM HUM...

    En lieu et place d'utiliser directement la tableB dans vos programmes utilisez directement une vue V_TABLEB par exemple qui ira chercher directement 'info' dans la table A ainsi vous respectez les règles de modélisation en évitant les redondances d'informations.

    En outre pensez au BETWEEN dans vos requètes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ...WHERE  TableB.ip BETWEEN TableA.ip1 and TableA.ip2)

  5. #5
    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
    Oui en fait je suis d'accord du début avec vos remarques mais pour être tout à fait clair, il y a déjà un programme de fait (pas par moi) qui utilise la tableB et qui n'utilisera pas autre chose que la tableB Donc tant pis pour merise...

    Est ce que le fait d'utiliser between est plus performant que d'utiliser un filtre >= and <= ?

    Et je reviens à ma question initiale, vous me conseillez quoi comme indexes sur tableB ? Que l'on créé une vue ou pas il faudra bien indexer cette table non ?

    Merci

  6. #6
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Cette requête sera plus performante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE TB
       SET TB.info = TA.INFO
      FROM TableB TB, TableA TA
     WHERE TB.IP BETWEEN TA.IP1 AND TA.IP2
       AND TB.info IS NULL
    Elle permet en outre de profiter pleinement d'un index placé sur le couple IP1 IP2.

    En surveillant les problématiques de volumétrie vous pouvez même songer à un index COUVRANT en ajoutant TableA.info en tant que colonne incluse dans l'index.

    Est ce que le fait d'utiliser between est plus performant que d'utiliser un filtre >= and <=
    Vous viendait-il à l'idée de recoder dans vos requêtes des fonctions comme RIGHT() ?
    C'est pareil pour BETWEEN, s'il existe ce n'est pas pour nous embêter...

Discussions similaires

  1. Question sur index DB2 400
    Par Jibon dans le forum DB2
    Réponses: 4
    Dernier message: 19/08/2007, 16h58
  2. une question optimisation
    Par rassmug dans le forum DB2
    Réponses: 2
    Dernier message: 20/07/2007, 09h07
  3. [Optimisation] index non utilisé et using temporary
    Par jp_rennes dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/10/2006, 10h05
  4. question optimisation
    Par Eusebius dans le forum Langage SQL
    Réponses: 8
    Dernier message: 13/05/2006, 12h46
  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