07-03-2014, 11:56 PM
Les comportements varient vraiment entre deux moteurs SQL différents.
J'ai fait un test sur un serveur SQL Server et la différence en une jointure sur deux tables avec des milliers d'enregistrements et une sous requête est flagrante : d'après les estimations du plan de requête, le coût en CPU est carrément divisé par 100.
Évidemment, ça dépends de la répartition des données. Dans mon exemple, j'avais environ 10% de côtes / 30% de terre.
Plus il y a de cases de côtes, plus le coût sera élevé et inversement.
Pour en revenir à ton choix, stocker l'ID sur la ligne simplifie effectivement le processus et par conséquent améliore les performances.
Par contre, pourquoi ne pas pousser un peu plus loin la dénormalisation en stockant par exemple, pour chaque case voisine un flag indiquant si c'est une case de mer ou non (merVoisin1, merVoisin2, etc). Ca supprimerait le besoin de faire des jointures.
En contrepartie, ça demanderait de resynchroniser les valeurs des colonnes merVoisin à chaque changement de niveau.
Ça pourrait être intéressant si tu as souvent besoin de trouver les cases de côtes mais que le niveau des eaux ne change que rarement.
Autre possibilité : l'altitude des cases de ta carte étant fixe, tu peux tout précalculer à l'avance et stocker sur la ligne le niveaux de montée des eaux nécessaire pour submerger la case en question.
En fait, tout dépends des opérations qui sont répétées souvent.
J'ai fait un test sur un serveur SQL Server et la différence en une jointure sur deux tables avec des milliers d'enregistrements et une sous requête est flagrante : d'après les estimations du plan de requête, le coût en CPU est carrément divisé par 100.
Évidemment, ça dépends de la répartition des données. Dans mon exemple, j'avais environ 10% de côtes / 30% de terre.
Plus il y a de cases de côtes, plus le coût sera élevé et inversement.
Pour en revenir à ton choix, stocker l'ID sur la ligne simplifie effectivement le processus et par conséquent améliore les performances.
Par contre, pourquoi ne pas pousser un peu plus loin la dénormalisation en stockant par exemple, pour chaque case voisine un flag indiquant si c'est une case de mer ou non (merVoisin1, merVoisin2, etc). Ca supprimerait le besoin de faire des jointures.
En contrepartie, ça demanderait de resynchroniser les valeurs des colonnes merVoisin à chaque changement de niveau.
Ça pourrait être intéressant si tu as souvent besoin de trouver les cases de côtes mais que le niveau des eaux ne change que rarement.
Autre possibilité : l'altitude des cases de ta carte étant fixe, tu peux tout précalculer à l'avance et stocker sur la ligne le niveaux de montée des eaux nécessaire pour submerger la case en question.
En fait, tout dépends des opérations qui sont répétées souvent.
Quand on te dit qu'un projet est terminé à 90%, prépare toi pour les 90% suivant
Ninety-Ninety Rule
"Une guerre de religions, c'est quand deux peuples s'entretuent pour savoir qui a le meilleur ami imaginaire"
Vu sur IRC
Ninety-Ninety Rule
"Une guerre de religions, c'est quand deux peuples s'entretuent pour savoir qui a le meilleur ami imaginaire"
Vu sur IRC