EN vs OU de l'Oracle, qui plus vite?
Je suis du développement d'une application qui traite beaucoup de données dans la base de données Oracle.
Dans certains cas, je dois faire beaucoup d'objet en fonction d'une liste de conditions, et je l'utilise SELECT ...FROM.. WHERE... IN...
, mais le IN
de l'expression accepte une liste dont la taille est au maximum de 1 000 articles.
Donc j'utilise OR
expression à la place, mais comme je l'ai observer, peut-être que cette requête (à l'aide de OR
) est plus lent que IN
(avec la même liste de conditions). Est-il juste? Et si oui, comment améliorer la vitesse de la requête?
- La liste est-elle statique ou dérivée à partir d'une requête?
- Non, la liste de valeur pour la requête a été récupéré à partir de ressources externes. Est-il possible de résoudre ce problème, parce que ma liste est trop grande, peut contenir plus de 100000 articles
- Donc, vous êtes en train de créer un énorme chaîne de requête contenant quelque chose comme DANS (...9997, 9998, 9999, 1000,1001 ...) ? En soi, cela va coûter beaucoup, de transmettre et d'analyser. Jamais l'esprit, l'injection sql possibilités.
Vous devez vous connecter pour publier un commentaire.
IN
est préférable deOR
--OR
est notoirement mauvais interprète, et peut causer d'autres problèmes qui requièrent l'utilisation de parenthèses dans les requêtes complexes.Meilleure option que soit
IN
ouOR
, est à joindre à une table contenant les valeurs que vous voulez (ou ne voulez pas). Ce tableau de comparaison peuvent être dérivées, temporaire, ou déjà existant dans votre schéma.IN
est optimisé vs l'aide deOR
-- c'est plus que du sucre syntaxique.Dans ce scénario, je ferais ceci:
Cela signifie que vous pouvez laisser le tri à la base de données et d'écrire une requête simple.
Oracle en interne convertit DANS les listes de listes de Sro, de toute façon, donc il n'y a pas de différences de performances. La seule différence est que l'Oracle a transformer INs, mais a plus de chaînes pour analyser si vous fournissez de la Rup-vous.
Voici comment vous tester.
Je m'interroge sur l'ensemble de la démarche. Le client de la SP a envoyer 100000 Id. D'où vient le client d'obtenir les codes d'? Envoyer un grand nombre d'ID en tant que paramètre de la proc va de manière significative le coût de toute façon.
Si vous créez une table avec une clé primaire:
et d'aller dans le même Choisit pour exécuter la requête avec les multiples valeurs, suivie par la récupération de l'exécution du plan par la valeur de hachage, ce que vous obtenez est:
Cela semble impliquer que lorsque vous avez une liste et sont à l'aide de ce avec un PK colonne, Oracle conserve la liste en interne comme "DANSLISTE" parce qu'il est plus efficace de ce processus, plutôt que de le convertir pour les Rup comme dans le cas de non-indexé table.
J'ai été en utilisant Oracle 10gR2 ci-dessus.