Salut à tous.
A cette époque là, j'étais encore ingénieur d'étude et je faisais beaucoup de développement cobol / jcl.Envoyé par fsmrel
Je l'ai lu. Très intéressant comme expérience ! Et c'est pourquoi, il ne faut pas laisser n'importe qui faire n'importe quoi.Envoyé par fsmrel
J'ai déjà été confronté à des problèmes similaire, comme la fois où un pseudo DBA croyait bien faire et dégradait les performances de l'ensemble d'un projet, juste pour améliorer la performance d'une lourde requête.
Je ne confronte pas théorie d'un coté et technique de l'autre. Ce sont juste des aides pour parvenir au but recherché.Envoyé par fsmrel
Quand je dis que je suis pragmatique, je veux signifier que je ne prends jamais rien pour argent comptant.
De ce fait, je vérifie et j'expérimente toujours avant de faire une modification. Et même après la modification, je vérifie l'impacte que cela a sur le reste du projet.
Mon credo reste toujours le juste équilibre entre d'une part le respect de la normalisation et d'autre part le cout en volumétrie et en temps d'exécution, autrement dit en performance.
Oui, manque de précision de ma part. Je ne parle pas des formes normales que je respecte, mais des normes SQL.Envoyé par fsmrel
Quand on travaille avec un SGBD, la norme SQL n'est pas toujours respectée et seul le fonctionnement du SGBD fait preuve de foi. Donc on fait avec !
Ce qui signifie que d'un SGBD (DB2) à l'autre (MySql), on peut se retrouver avec des normes différentes, dues à des évolutions différentes dans le temps.
Et je n'aime pas trop que l'on dise du mal de MySql car certains membres ayant fait l'usage d'un SGBD plus respectueux des normes SQL se retrouvent en panne d'imagination pour trouver la solution sous MySql.
A vrai dire, je ne connais pas la norme SQL, mais juste la façon dont elle est appliquée dans DB2. C'est DB2 que je connais et non la norme SQL.Envoyé par aieeeuuuuu
Je recherchais à l'identique ce que je connaissais de DB2 mais dans MySql. Voilà pour les explications.
Je comprends ce que vous me dites, mais quand on fait un "select * from test" par exemple, je m'attends à obtenir un 'full scan' de ma table triée selon l'ordre de ma "primary key' et non sur un autre indexe. C'est pas logique !Envoyé par aieeeuuuuu
Mais quand je compare le résultat produit par cette requête, juste en changeant "InnoDB' par "Memory' ou encore 'MyIsam', je suis surpris de ne pas obtenir la même chose.
C'est en cela que je dis qu'il y a un bug de fonctionnement.
J'ai bien compris que la solution est de faire "select * from test order by clef", juste pour influencer l'optimiseur à faire l'usage de la 'primary key'.Envoyé par aieeeuuuuu
J'ai testé autre chose (les hints) afin de voir ce que je pouvais obtenir, mais ce n'est pas la solution à envisager, enfin dans cet exemple là.
J'en conviens que cela ne m'est jamais encore arrivé et cela peut surprendre d'avoir de l'aléatoire dans le fonctionnement d'un SGBD.Envoyé par aieeeuuuuu
Il se peut que l'on rencontre des problèmes forts différents entre le gros système et la micro.
Je ne parle pas du tri, dans le sens de l'usage du 'filesort', mais de l'ordre apparent à l'affichage qu'il faut distinguer de l'ordre réel dans le 'table space'.Envoyé par aieeeuuuuu
Si vous faites un vidage de votre 'table space' par un utilitaire, vous devriez observer que les lignes ne sont pas stockées dans l'ordre en fonction de votre 'primary key' mais en fonction du 'rowid'. Je nomme cela l'ordre réel.
Si maintenant vous faites un 'select * from test', ce n'est pas l'ordre réel que vous obtenez, mais l'ordre apparent selon l'indexe qui est en usage (voir l'explain) à cet instant.
La 'primary key' est un indexe comme les autre. Alors à quoi sert la primary key et pourquoi faire une distinction avec les autre indexes ?
Elle sert à faire le lien entre l'emplacement réel de la ligne dans le 'table space', et l'ordre apparent selon cette 'primary key'.
Et c'est pourquoi, quand on crée un indexe, celui-ci fait toujours référence à la primary key.
Si à chaque insertion, modification ou suppression, MySql se réorganiserait alors l'ordre réel serait toujours en conformité avec l'ordre apparent de la 'primary key'.
Et de ce fait, une réorganisation de la table et de surcroit du 'table space' ne servirait à rien ! Or il n'y a pas de réorganisation automatique.
Il faut comprendre que les lignes dans un 'table space' sont dans un ordre quelconque, disons aléatoire.
Mais quand on fait un 'select', l'ordre apparent est toujours selon l'ordre soit de la 'primary key', soit d'un l'indexe.
S'il n'y a pas de 'primary key' ou d'indexe alors l'ordre apparent est en conformité avec l'ordre réel.
Je pense que vous ne m'avez pas compris sur ce sujet, où d'une part je ne parle pas de tri, mais d'ordre (réel et apparent) et d'autre part la façon dont le SGBD s'organise d'une manière aléatoire pour stocker les lignes dans le 'table space'.
Si je me suis trompé dans mes explications, donnez moi un exemple qui prouve que j'ai tort.
D'ailleurs, connaissez vous un utilitaire qui fasse le vidage "physique" d'un 'table space' ? Je ne parle pas, bien sûr, de mysqldump.
@+
Partager