Optimisation d'une table

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Optimisation d'une table

par zeus » 15 déc. 2006, 10:33

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton [Mettre Résolu] qui s'affiche en haut à gauche de ce sujet si tu as posté le 1er message en tant que membre (inscrit et identifié). ;)

par Tonypeter » 15 déc. 2006, 10:26

Merci pour ces précieuses infos...
Merci à vous tous!

par sadeq » 15 déc. 2006, 10:09

Pour optimiser en général :
Au niveau de la structure :
Le problème des index:
Car un index unique, avec doublon, clé primaire ou clé étrangère imopse systématiquement un processus de tri et crée un support index supplémentaire dont la taille est équivalente à celles des champs index (le volume étant cette taille multipliée par le nombre d'enregistrements)
Et dans ce cas si t'as un index sur un champ entier de 2 oct dans une table qui contient 100 enregistrements, le volume supplémentaire engendré par l'index est de 200 oct.
En plus, le processus de tri est exécuté à chaque INSERT/Update/DELETE ce qui provoque une réindexation (recalcul du fichier index). Et ça coûte cher. Alors:
  • Ne pas déclarer les index (uniques ou boublons) inutils
    Pas de clés primaires dans les tables qui servent de relation binaire (ou N'aire) et qui sont donc seulement dépondantes d'autres tables
    Pas de clés auto-incrémentées systématiques car ceci engendre un calcul supplémentaire en plus du tri
    Utiliser des clés primaires de type numérique (entier le moins long possible) car le tri des entiers est simple et leurs petite taille diminue la taille totale de l'index
Le problème de taille et volume
En plus du problème d'index qui influent sur le volume de la table, le choix des types des champs est important car un type implique une taille en oct. Il faut alors faire le bon choix du nombre et du type des champs à déclarer dans la table et bien sûr ne pas déclarer de champs calculés car les requêtes sont, en autres, faites pour ça.

Le problème de la redondance de déclaration d'un champ
La redondance de définition est un problème qui influt sur le volume d'une table et sur la cohérence des mêmes natures de données existantes dans plusieurs tables.
Si un champ peut contenir plusieurs mêmes valeurs et que ses valeurs sont un critère de regroupement alors sa définition doit être effectuée une fois dans la base de données et partagée entre les tables et c'est le fondement même du modèle relationnel.

Exemple:
le champ "situation_familiale" ne peut avoir pour un enregistrement qu'une des valeurs : célibataire, marié(e), divorcé(e) ou veuf(ve)
Mais puisque ces valeurs vont se multiplier par le nombre d'enregistrements de la table, il vaudrait mieux les coder pour diminuer le volume de la table.
En les codant : c, m, d, v on gagne plusieurs oct et en même temps pour ne pas perdre leur signification il faut définir la situation familiale une seule fois dans une table séparée. Définition qui redonne aux codes choisis leur signification tout en gardant le lien entre la table "situation familiale" et celles qui doivent utiliser un champ "situation_familiale"
La situation familiale ainsi définie devient une définition de champ générale à la base et donc réutilisable par plusieurs tables. Si une table a besoin donc du champ "situation_familiale" elle se met en relation avec sa table de définition. Ce qui élimine l'effet négatif de la redondance mais pas la redondance elle même.

La redondance peut être aussi transitive en déclarant des champs pouvant être calculés à partir d'autres sous prétexte de rendre l'accès rapide aux calcul. En effet, l'effet négatif d'une telle redondance est double : le volume de la table augmente et les calculs ne sont pas à jour à moins d'exécuter deux requêtes de recalcul (Select calcul+Update).

Par exemple
dans la table panier d'articles, si on met des champs "total ht" , "montant tva" et "total ttc" c'est une redondance car les 3 champs peuvent être calculés par une requête SELECT à partir des 2 champs "prix de l'article" et "quantité commandée"

Au niveau des enregistrements:
Il faut de temps en temps sauvegarder le contenu des tables et effectuer une réindexation totale, bref "le ménage"
Pour les tables lourdes contenant énormément d'enregistrements il faut penser les partitionner en clones où on peut subdiviser le contenu lourd en plusieurs parties lègères. Cette procédure peut être effectuée par des requêtes.

par Tonypeter » 15 déc. 2006, 10:00

Ben tu peux toujours mettre que la valeur 0 dans le champ métier équivaut a un chomeur, et que si il celui ci est supérieur a 0 ce n'est pas un chomeur
Oui...
Mais c'était pas un bon exemple.
Si on a un champ MARIAGE qui contient le nom du marié, il est possible qu'il contienne la valeur NULL...si le joueur n'est pas marié!
Problème!
Merci

par Cyrano » 15 déc. 2006, 09:57

Définissons la redondance : est-ce que cette donnée peut être disponible ailleurs dans ta base ? Si oui, alors il y a redondance, sinon, alors c'est correct.

par Tonypeter » 15 déc. 2006, 09:56

Cyrano:
- les noms de colonnes en majuscule, c'est complètement inutile et personnellement, je privilégie le "tout en minuscule";
- Les type de colonnes doivent être choisi en fonction du besoin et des valeurs qui seront enregistrées, donc par exemple on évitera les VARCHAR pour enregistrer une date et ce genre de choses.
- Les tables doivent être conçues autant que faire se peut de façon à éviter au maximum la possibilité de stocker des valeurs NULL, on séparera éventuellement une table en deux pour résoudre ce point si la quantité de données le justifie.
Les 2 premiers points, je suis au courant.
Pour le 3ème, je savais pas.
Quel est le problème si on a un champ qui stock une valeur nulle?

par momox » 15 déc. 2006, 09:55

Ben tu peux toujours mettre que la valeur 0 dans le champ métier équivaut a un chomeur, et que si il celui ci est supérieur a 0 ce n'est pas un chomeur :)
@+

par Tonypeter » 15 déc. 2006, 09:50

Salut,
Je respecte les "formes normales", mais je voulais juste savoir s'il y a d'autres détails qu'on peut améliorer, j'ai l'impression que non...
En ce concerne la rapidité des requêtes, je ne sais pas trop non plus comment les améliorer...
Le principe est qu'une donnée ne se trouve jamais deux fois en base de données.
Si on a un champ OPTIONS contenant que des 0 ou 1 avec toutes les...options de l'utilisateur (du style connecté, compte confirmé etc etc ), c'est considéré comme une donnée enregistrée 2 fois?
Je m'explique: par exemple, un champ METIER qui peut avoir la valeur 1, 2, 3, 4 [...] chaque chiffre représentant un métier. Et dans le champ OPTIONS on a un bit de valeur 0 ou 1 : 0 c'est au chomage, 1 c'est avec un métier.
C'est redondant ou pas?
Merci

par Cyrano » 15 déc. 2006, 09:43

Sans voir quoique ce soit de la structure de ta base, impossible de te répondre précisément.

Mais dans les généralités :
- les noms de colonnes en majuscule, c'est complètement inutile et personnellement, je privilégie le "tout en minuscule";
- Les type de colonnes doivent être choisi en fonction du besoin et des valeurs qui seront enregistrées, donc par exemple on évitera les VARCHAR pour enregistrer une date et ce genre de choses.
- Les tables doivent être conçues autant que faire se peut de façon à éviter au maximum la possibilité de stocker des valeurs NULL, on séparera éventuellement une table en deux pour résoudre ce point si la quantité de données le justifie.

Pour le reste, il faudrait voir ton modèle conceptuel et analyser le cahier des charges, c'est un boulot qui prend un peu plus que cinq minutes. :-k

par zeus » 15 déc. 2006, 09:38

L'optimisation d'une table, c'est suivre les formes normales

Le principe est qu'une donnée ne se trouve jamais deux fois en base de données.

ATTENTION : ceci permet d'améliorer l'atomicité et le poid d'une base de données, mais pas forcément la rapidité des requetes ;)

Optimisation d'une table

par Tonypeter » 15 déc. 2006, 09:32

Bonjour à tous,
Je code en ce moment la v2 d'un site, et j'aimerais qu'elle soit le plus optimisée possible. Mais au niveau de la bdd, j'ai des problèmes: je ne vois pas trop ce qu'il y a à améliorer.
Les noms de champs en Majuscules, ça sert à quelquechose?
Y a-t-il quelquechose de spécial à faire pour qu'elle soit bien optimisée?
J'ai déjà fait en sorte que les tables soient bien structurées, avec des liens entre elles pour les JOIN etc
Mais à part ça...je vois pas trop :roll:
Merci beaucoup