|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : mars 2008 Messages : 202 ![]() |
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 :
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 ! |
||
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
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 * * * * * |
|
00
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Inscription : mars 2008 Messages : 202 ![]() |
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 |
|
|
00
|
|
|
#4 | |||
|
Membre Expert
![]() |
Citation:
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 :
|
|||
|
|
00
|
|
|
#5 |
|
Candidat au titre de Membre du Club
![]() Inscription : mars 2008 Messages : 202 ![]() |
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 |
|
|
00
|
|
|
#6 | |||
|
Membre Expert
![]() |
Cette requête sera plus performante :
Code :
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:
C'est pareil pour BETWEEN, s'il existe ce n'est pas pour nous embêter... |
|||
|
|
00
|
|
|
#7 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 667 ![]() |
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 |
|
00
|
|
|
#8 |
|
Candidat au titre de Membre du Club
![]() Inscription : mars 2008 Messages : 202 ![]() |
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 |
|
|
00
|
|
|
#9 |
![]() ![]() ![]() David BARBARINExpert SQL Server Inscription : août 2005 Messages : 3 723 ![]() |
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. ++ |
|
00
|
|
|
#10 |
|
Membre Expert
![]() |
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 |
|
|
00
|
|
|
#11 | |||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
Citation:
EXEMPLE : Code :
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 * * * * * |
|||
|
00
|
|
|
#12 |
|
Membre Expert
![]() |
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. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com