2009-05-29 4 views
0

Je maintiens un ORM interne écrit en C#, et il ne dispose actuellement d'aucun mécanisme de chargement enthousiaste. Pour améliorer les performances, nous avons décidé que cela nécessiterait un chargement passionné, nous devons donc écrire notre propre code pour le supporter. (Mes collègues et moi n'avons aucune expérience avec les outils ORM, et en outre, pour des raisons héritées, nous ne sommes pas autorisés à utiliser des outils populaires comme LinqtoSQL, Entity Framework ou Nhibernate.)Besoin de conseils pour écrire mon propre algorithme de chargement rapide

Ma question est, qui est la meilleure pratique acceptée pour générer des instructions SQL de chargement impatients? Je l'ai pensé et trouver deux façons -

En supposant un exemple classique de 4 tables - A CustomerCategory a de nombreux clients Un client a beaucoup Commander Un ordre a beaucoup OrderDetail

et en supposant que je voulez charger avec impatience les données de toutes les 4 tables, et ma condition est - où Order.OrderDate entre '2008-05-05' et '2008-12-31'

Méthode 1 - Je génère un sql pour aller chercher le les données de toutes les 4 tables, toutes utilisant des jointures internes de sorte que je reçois une ligne pour chaque combinaison unique des clés primaires de chaque table. Je vais appliquer ma condition Where à ce sql.

Méthode 2 - Je génère un SQL pour obtenir uniquement les données de commande en premier, et j'applique ma condition Where à ce sql, puisque le Order.OrderDate provient de la table Order. Ensuite, en fonction des résultats de cette requête, je connaîtrai toutes les valeurs d'identifiant de commande dont j'ai besoin, donc je les utiliserai pour récupérer les données détaillées de la commande. Je connaîtrai également toutes les valeurs d'identifiant client uniques dont j'ai besoin, donc je les utiliserai également pour récupérer les données de la table des clients, et finalement je ferai de même pour la CustomerCategory. Cette méthode nécessiterait 4 instructions SQL dans tous.

Je peux voir que la première méthode est plus efficace, mais un de mes collègues a souligné que la deuxième méthode, bien qu'elle utilise 4 instructions SQL, est plus facile à écrire et à maintenir, ce que je suis d'accord.

Toute idée à ce sujet serait grandement appréciée. Merci!

Répondre

0

Tout d'abord, votre modèle de domaine est massivement faux. Personnellement, je ne peux pas justifier une collection d'objets dans un CustomerCategory parce que cela n'a aucun sens du point de vue de la performance: la lune bleue mais elle sera là tout le temps, provoquant toutes sortes de problèmes. La même chose s'applique à Customer ayant de nombreux Order s.

Maintenant, à votre question. Il est généralement considéré que le nombre d'allers-retours à la base de données devrait être réduit au minimum, même au prix de récupérer plus de données que nécessaire. Cela dit, joindre deux grandes tables (long & large) pour sélectionner les données de deux tables associées simultanément pourrait être un tueur de performance, alors méfiez-vous.

Je vous recommande de voir comment cela se fait dans NHibernate. Il vous permet de spécifier la stratégie de récupération (join, select) pour chaque association, que ce soit une association un-à-un, ou un-à-plusieurs. Si vous utilisez Microsoft SQL Server 2005 ou version ultérieure, vous pouvez utiliser MARS pour insérer plusieurs select dans un lot, puis hydrater tout un graphe d'objets émettant une seule commande SQL.

+0

merci pour votre aide. J'avoue qu'il y a en effet quelque chose qui ne va pas avec notre modèle. Nous allons examiner, et regarderons nhibernate selon votre suggestion. – janem

Questions connexes