2010-06-11 4 views
1

J'ai actuellement une requête SQL qui est actuellement appelé à plusieurs reprises comme celui-ci (pseudo code):Fine tune certaines fonctions SQL appelé plusieurs fois

foreach(KeyValuePair kvp in someMapList) 
{ 
    select col1 from table where col2 = kvp.key and col3 = kvp.value; 
    //do some processing on the returned value 
} 

Le pourrait évidemment appeler au-dessus de la base de données d'un grand nombre de fois si elle est une grande liste de paires. Quelqu'un peut-il penser à un SQL plus efficace qui pourrait essentiellement renvoyer une liste de valeurs spécifiques basées sur une liste de deux informations uniques de sorte que le traitement peut être fait en masse? Une solution évidente serait de construire un gros morceau de SQL avec des OR mais cela serait probablement inefficace?

Merci

Carl

+1

Il est probablement plus inefficace de faire un grand nombre d'appels à sql-server puis de construire une requête avec beaucoup de ou. Assurez-vous simplement que les index sont corrects. –

+0

Faites-le en un coup, même si cela signifie beaucoup de 'ou'. Essayez de ne jamais interroger dans une boucle. – Jay

+0

J'ai * juste * remarqué l'étiquette nhibernate sur cette question. Si le pseudo-code que vous montrez utilise actuellement HQL ou ICriteria, vous pouvez simplement laisser NHibernate le regrouper en un seul lot pour vous: http://nhforge.org/blogs/nhibernate/archive/2008/08/31/the- query-batcher.aspx – Jay

Répondre

0

Insérer KeyValuePair dans une table et d'utiliser un homme REJOIGNEZ ou (si C#)

from record in table 
join key in someMap on record.col2 equals key.key && record.col3 equals key.keyvalue 
select col1 //or some anonymous type or a DTO I do not know... 

qui est bien plus efficeint: D

+0

J'ai vu cela mentionné ailleurs, mais ne sera pas la surcharge de l'insert (et la suppression après) l'emportent sur la sélection? Il y a probablement environ 100 kvp recherchés à chaque fois? – Carl

0

En supposant que vous êtes bloqué avec le modèle de paire entity-value, votre meilleur choix est soit de créer une procédure stockée et de transmettre une chaîne délimitée de vos paires que vous pouvez puis transformez-vous en une table temporaire et sélectionnez à l'aide d'une jointure, ou si vous pouvez passer dans un paramètre de table qui serait encore mieux.

Une autre possibilité serait d'insérer dans une table de travail avec un type d'ID de connexion unique pour vos valeurs, puis de vous joindre à cela. Dans tous les cas, votre objectif est de pouvoir sélectionner les données en utilisant une méthode basée sur un ensemble en introduisant vos paires dans la base de données d'une manière ou d'une autre.

Questions connexes