Définir les clés et index sur une table

Résolu/Fermé
Blanc57 Messages postés 366 Date d'inscription vendredi 6 avril 2007 Statut Membre Dernière intervention 27 janvier 2020 - Modifié par Blanc57 le 3/02/2011 à 22:32
Blanc57 Messages postés 366 Date d'inscription vendredi 6 avril 2007 Statut Membre Dernière intervention 27 janvier 2020 - 7 févr. 2011 à 20:06
Bonjour,

Je dois utiliser une base de donnée avec IBM DB2 dans un projet et je n'y connais pas grand chose...
Il s'agit d'intégrer des indicateurs de performance de serveurs dans une base.

J'ai créé une base et une table contenant les indicateurs pour chacun des serveurs mais n'y connaissant rien, j'ai créé les index, les clés et les type de champs "à l'arrache" pour dans un premier temps, développer le site exploitant ces données sous forme de graphiques, mais les performances sont faibles.

Voici le type de données à intégrer :

timestamps;date;time;process_wait;active_virtual_pages;pages_in;pages_out;cpu_user;cpu_sys;cpu_wait;%cpu_total;memory_free
2011-01-27-00.10.29;2011/1/27;00:10:29;1;387977;0;0;1;1;0;2;437075
2011-01-27-00.10.49;2011/1/27;00:10:49;1;387985;0;0;1;1;0;2;437067
2011-01-27-00.11.09;2011/1/27;00:11:9;1;387971;0;0;1;1;1;3;437093
2011-01-27-00.11.29;2011/1/27;00:11:29;0;387978;0;0;1;1;0;2;437082
2011-01-27-00.11.49;2011/1/27;00:11:49;0;387977;0;0;1;1;0;2;437083
2011-01-27-00.12.09;2011/1/27;00:12:9;0;387974;0;0;1;1;0;2;437086

J'ai à intégrer 4000 lignes par jour sur les deux dernières années. Je crée une table par serveur et j'ai une trentaine de serveurs.

J'aimerais savoir comment placer les index et les clés pour des performances correctes sur les requêtes et éventuellement, si un partitionnement de table est nécessaire.


Question subsidiaire :


Je vais également devoir réaliser des graphs avec les moyennes, médianes et pourcentiles de chaques jours.
Est-il possible de gérer cela avec la base de donnée, en créant par exemple une table de moyenne qui intègre automatiquement les données en calculant les différentes valeurs depuis les relevés quotidiens ou alors est-il nécessaire d'utiliser un outil tierce qui ferait les calculs et les intégrerait ensuite ?

Merci d'avance pour votre aide.

A voir également:

4 réponses

Bonjour,

Le choix des indexes dans une base dépend de deux choses, empêcher les doublons avec une clef primaire c'est à dire unique non nulle sur un ou plusieurs champs, des clefs de recherche, quand on questionne la base, quelles seront le requêtes les plus courantes et enfin sur quoi on trie l'affichage éventuellement

Ici je dirais que la recherche devrait sur faire sur date et time
On recherche pour un jour donné on on trie selon l'heure, mais c'est une vision des choses. Alors pourquoi par timestamp ?
C'est bien aussi mais il faut savoir que l'utilisation d'une fonction sur un index tue l'index dans une clause where, donc si tu utilise une fonction sur timestamp pour comparer avec le jour, exit l'index

Pour ton Pb de stats, il existe des outils libres qui font déjà des stats sur les serveurs Linux comme Webmin https://www.webmin.com/
Signature non conforme - Publicité supprimée Modération CCM
0
Blanc57 Messages postés 366 Date d'inscription vendredi 6 avril 2007 Statut Membre Dernière intervention 27 janvier 2020 72
4 févr. 2011 à 21:52
Merci pour ta réponse internetwebservices

En fait mes recherches seront du genre :
select TIME,CPUTOTAL from INDIC_SRV1 where DATE='27.01.2011'

Je n'ai par contre pas bien sais ce que tu voulais dire par :
"il faut savoir que l'utilisation d'une fonction sur un index tue l'index dans une clause where, donc si tu utilise une fonction sur timestamp pour comparer avec le jour, exit l'index"

Voici mes créations de tables (sous DB2):

"create table VMSTAT_$SRV ( TS TIMESTAMP NOT NULL WITH DEFAULT, DATE DATE NOT NULL, TIME TIME NOT NULL, PROCWAIT SMALLINT, ACTVIRPAGES INT, PAGESIN SMALLINT, PAGESOUT SMALLINT, CPUUSER SMALLINT, CPUSYS SMALLINT, CPUWAIT SMALLINT, CPUTOTAL SMALLINT, FREEMEM INT );"

"create index IND_VMSTAT_$SRV on VMSTAT_$SRV (TS ASC);"

Je trouve mes requêtes tout de même assez longues, la génération des graphs depuis les fichiers CSV semblait plus rapide. Je devrais afficher plusieurs graphs par page et cela risque d'être trop long et inconfortable...

Je suis au courant qu'il existe déjà des produits mais ne pouvant installer de logiciels sur les serveurs, je ne peux faire qu'améliorer un système préexistant qui pour l'instant génère des fichiers HTML statiques, sans serveur web, par un script Perl et archivés au bout d'une semaine sous forme de zip.
Je peux donc réutiliser la partie "collecte des données sur les serveurs" qui remonte les données sous forme de CSV par TFTP sur une machine et à partir de là, exploiter ces données sur un serveur WEB avec BDD.

Merci encore.
0
Utilisateur anonyme
7 févr. 2011 à 08:31
Bonjour,

Pour ton select la clef sur la table doit être sur le champ date

Pour ce qui est des fonctions, imagine que tu recherches les données pour un mois donné, tu serais tenté de faire

select * from INDIC_SRV1 where to_char(DATE,'mmyyyy')='012011'

Ce genre de requête n'utilise pas l'index sur la date, car tu as utilisé la fonction to_char() qui transforme le champ, du coup toute la table est parcourue.

Dernier point je suis étonné que des requêtes soient plus lentes que la lecture d'un CSV, c'est un comble, il doit y avoir quelque chose de moisi dans tes requête ou ta structure, à moins que tes tables dépassent les 100 000 lignes, et encore avec DBII, ou alors ton serveur est une charrette.

Cordialement
0
Blanc57 Messages postés 366 Date d'inscription vendredi 6 avril 2007 Statut Membre Dernière intervention 27 janvier 2020 72
7 févr. 2011 à 20:06
Bonjour,

Mes requêtes sont sur une journée, donc d'après ce qu'il me semble comprendre, il faut que je crée un index sur la date.

Quant à la lenteur :

- Mes tables font plus de 100.000 lignes (prêt de 1.500.000 lignes)
- C'est un vieux portable qui fait office de serveur juste pour développer mon projet

Forcément, dans ces conditions...

Merci encore pour ton aide.
0