|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre chevronné
![]() ![]() Inscription : juillet 2006 Messages : 1 194 ![]() |
Bonjour.
J'ai plusieurs lignes qui sont regroupées par une clé indexée dans une table. Ces lignes ont une durée d'existante très courte dans le système, et les INSERT et DELETE se succèdent rapidement. Comme ces deux opérations causent le recalcule de l'index, je me demandait si plutôt que de regroupé via cette clé, je faisais une table propre par groupe, alors j'obtiendrai un meilleur résultat. TABLE Base cleGroupe INT (index non cluster) , valeur INT (1, 1) (1, 2) (1, 3) (2, 1) (2, 3) Deviendrait => TABLE Resultat_1 valeur INT (1) (2) (3) TABLE Resultat_2 valeur INT (1) (3) Cela ne causerait plus de recalcule d'index. Par contre cela causerait la création et la suppression fréquentes de nouvelles tables. Est-ce une approche judicieuse selon vous ? Que me conseillez-vous ? |
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 954 ![]() |
Jamais !
1) comment rajouter un groupe ? 2) sauf si l'insertion est monotone, l'index sera de toutes façon recalculé 3) pour les procédures de maintenance ou la modif, vous serez obliger de passer en revue toutes les tables. Mais pour minimiser l'impacte de la fragmentation, vous pouvez introduire un fill factor de 80% par exemple, dans votre table. 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 | |
|
Membre chevronné
![]() ![]() Inscription : juillet 2006 Messages : 1 194 ![]() |
Citation:
Ç'est à dire qu'à aucun moment j'ai besoin de récupérer ou modifier la moindre information sur plus d'un groupe à la fois. Pour le rajout, il s'agit de la création d'une nouvelle table avec une syntaxe de nommage rigoureuse. Les seules choses qui devraient m'éloigner de la décision de travailler par tables seraient : 1) la création et la suppression d'une table auraient un surcoût important (je ne leur en connais pas) comparativement à un insert+delete avec index. 2) Ils existent des mécanismes (que j'ignorerais) pour fragmenter (au sens non technique) virtuellement une seule table. Je vais faire quelques tests et exploser les résultats. |
|
|
|
00
|
|
|
#4 | ||||
|
Membre chevronné
![]() ![]() Inscription : juillet 2006 Messages : 1 194 ![]() |
Voilà ce que ça donne.
D'abord, l'opération en DELETE + INSERT pures. Ensuite, l'opération avec des UPDATE (champ erased) qui remplacent jusqu'au dernier DELETE (exclu) pour limiter la mise à jour de l'index. Finalement (le plus rapide), l'opération sur une table propre au traitement et sans index. Code :
Code :
|
||||
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() |
Détail des index présents?
Vous ne gérez pas ici l'ajout dynamique de la table ainsi que l'impact de sa création sur le temps total... Si ce n'est pas indiscret quel est le contexte d'utilisation de ce 'modèle'?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
00
|
|
|
#6 | ||
|
Membre chevronné
![]() ![]() Inscription : juillet 2006 Messages : 1 194 ![]() |
Tout est dans le code*.
* À l'exception (oubli) de l'index pour test56_alt qui est le même que pour test56. Citation:
Citation:
Ces queries vont éliminer des valeurs au fur et à mesure (il n'y a qu'un seul insert initial) selon des mécanismes divers et complexes. |
||
|
|
00
|
|
|
#7 | |
|
Membre Expert
![]() |
Citation:
Ce qui suit sort du cadre de SQL SERVER mais quel intérêt avez vous à stocker cela en base? Ces données doivent'elles forcement être persistées? Ceci dit pour moi la solution que vous présentez, si elle peut marcher induit des mécanismes qui s’éloignent de ma conception de l'utilisation d'un SGBDR (fourre tout servant de stockage d'appoint) et une complexité (détection de la présence d'une table, création de cette dernière avec nom dynamique... suppression etc) qui ne me parait pas justifié ici...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#8 | ||
![]() ![]() |
Est-ce qu'à ce moment-là l'index se justifie ?
Sur mon environnement : Code :
À évaluer sur votre environnement bien entendu.
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#9 |
|
Membre chevronné
![]() ![]() Inscription : juillet 2006 Messages : 1 194 ![]() |
Les données bien que temporaires sont stockées en DB car, elle n'ont d'intérêt que pour les requêtes et qu'elles peuvent représenter un nombre important de lignes (trop important que pour tenir dans une clause IN*).
* la forme la plus brève pour faire un test sur une valeur. |
|
|
00
|
|
|
#10 | |||
|
Membre chevronné
![]() ![]() Inscription : juillet 2006 Messages : 1 194 ![]() |
Citation:
Car on pourrait simultanément avoir plusieurs groupe de centaines de milliers de lignes chacun. D'ailleurs, à priori ces SELECT eux aussi profiteraient de se faire sur des table test56_1, test56_2, test56_3, ... Un table scan sera plus rapide sur la table test56_1 (dont toutes les valeurs devront quand même être lues) plutôt qu'une recherche sur index et lecture de la ligne sur la table test56 pour cle = 1. Donc d'un point de vue performance, je suis confiant que ce soit un plus. Mais je me demande quand même s'il n'y a pas d'autres méthodes que j'ignorerais. |
|||
|
|
00
|
|
|
#11 | |
![]() ![]() |
Citation:
Si ce sont des milliers de groupes, c'est une autre affaire. Peut-être une solution du côté du partitionnement, si vous avez une idée à l'avance des groupes ?
__________________
Email : http://scr.im/waldar |
|
|
00
|
|
|
#12 | |
|
Membre chevronné
![]() ![]() Inscription : juillet 2006 Messages : 1 194 ![]() |
Citation:
Non, ces groupes sont totalement dynamiques (j'utilise d'ailleurs une autre table pour en gérer les identifiants (autoinc)). |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com