Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/02/2011, 22h09   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 202
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 202
Points : 13
Points : 13
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 :
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 !
boby62423 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 00h04   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 769
Points : 17 769
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 07h33   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 202
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 202
Points : 13
Points : 13
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
boby62423 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 08h57   #4
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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 :
1
2
 
...WHERE  TableB.ip BETWEEN TableA.ip1 AND TableA.ip2)
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 09h01   #5
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 202
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 202
Points : 13
Points : 13
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
boby62423 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 09h52   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Cette requête sera plus performante :
Code :
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.

Citation:
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...
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 13h15   #7
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
D'autant que SQL Server "retraduit" le BETWEEN a AND b en >= a AND <= b

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 21h07   #8
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 202
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 202
Points : 13
Points : 13
Ok pour l'index couvrant, c'est une fonctionnalité que j'avais l'habitude d'utiliser sous Mysql.

Par contre je ne comprend pas pourquoi mais dans le management studio je ne peux pas faire d'index couvrant en index cluster. Je suis obligé de faire un index non cluster. C'est normal ?

Merci d'avance
boby62423 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 22h38   #9
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Un index couvrant possède la clé d'index + les colonnes couvrantes au niveau feuille alors que celui d'un index cluster est en réalité la table elle même.

C'est la raison pour laquelle qu'un index couvrant est forcément non cluster.


++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 07h58   #10
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
De plus un index cluster est par essence unique (contrainte d'unicité).
Comme il contient la table il ne peux y en avoir qu'un puisque les autres indexes de la table(non cluster donc..) référence cet index
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 10h31   #11
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 769
Points : 17 769
Citation:
Envoyé par iberserk Voir le message
De plus un index cluster est par essence unique (contrainte d'unicité).
Comme il contient la table il ne peux y en avoir qu'un puisque les autres indexes de la table(non cluster donc..) référence cet index
Absolument pas... Unicité et CLUSTER n'ont rien à voir l'un avec l'autre.

EXEMPLE :
Code :
1
2
3
4
5
CREATE TABLE T (C INT)
 
INSERT INTO T VALUES (0), (0), (0);
 
CREATE CLUSTERED INDEX X ON T (C);
Apprenez SQL ! Mon site web, comme mon bouquin est là pour vous y aider !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 19h04   #12
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Autant pour moi je voulais dire unique (un seul par table).
Amalgame avec le fait que SQL SERVER place par défaut un index unique cluster lors de la définition d'une PK sur une table.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h45.


 
 
 
 
Partenaires

Hébergement Web