2009-08-03 8 views
3

si im en utilisant 2 requêtes:SQL: SELECT IN plus rapide et meilleure pratique?

première: Toutes les requêtes clés/ids nécessaires

seconde: select * from tab1 où tab1.id dans (... Liste ids .. ,,)

La liste des ID peut être plusieurs milliers ...

Est-il sage ou recommandé de faire des choses comme ça?

Répondre

7

En règle générale, il est parfaitement acceptable d'utiliser une clause IN dans vos instructions ... étant donné que vous utilisez une sous-requête pour des ensembles de valeurs plus grands. La réponse devrait toujours être: cela dépend! Il n'est pas clair à partir de votre question si votre liste de valeurs serait un SELECT, ou si vous les écririez en dur. Il serait certainement plus performant si ces valeurs de plusieurs milliers se trouvaient dans une autre table (table temporaire ou variable de table) et que vous les sous-estimiez. à savoir

SELECT * FROM Customer 
    WHERE CustomerID IN (SELECT ID FROM MyOtherLargeTableOfCustomers) 
  • comment bien indexé est cette colonne que vous effectuez cette IN clause?
  • quel est le type de données? Si un type de données numérique, alors vous ne devriez pas avoir de problèmes de performance.
  • Assurez-vous que votre STATISTICS (si SQL Server) est mis à jour régulièrement.
  • Si le type de données est basé sur char, ou guid, vous pouvez rencontrer des problèmes de performance, en particulier lorsque vous exécutez plusieurs requêtes en même temps, et la liste est dans les milliers que vous décrivez.
  • considérez JOIN à la place de ces tables; cela devrait toujours produire une requête plus rapide.
SELECT * FROM Customer AS C 
INNER JOIN MyOtherLargeTableOfCustomers AS M 
ON C.CustomerID = M.CustomerID 
1

si vos ID sont interrogeables dans une table jumelables, en utilisant une jointure interne devrait vous donner la plus rapide requête et vous donner une requête sensiblement plus petit d'envoyer à la DB.

Questions connexes