2013-04-19 5 views
1

J'ai une question simple:Oracle "Equal" plus rapide que "Different"

quelqu'un m'a dit que la requête:

select a1, a2, sum(b1) 
from myTable 
where a1 ='bla' and a2='blabla' and a3 ='aaa' 

est plus rapide alors

select a1, a2, sum(b1) 
from myTable 
where a1 ='bla' and a2='blabla' and a3!='bbb' 

Je peux comprendre que dans certains cas, en général, a = est plus rapide qu'un! =. mais dans ce cas, j'ai une somme (b1). Pour cela, je dois lire tout MyTable.

Merci. Cordialement

+3

Est-ce que "quelqu'un" ou quelque chose de fournir de référence? – Passerby

+1

Pourquoi avez-vous besoin de lire tout myTable? Votre clause 'where' est en train de filtrer, donc vous ne faites pas la somme de toutes les valeurs de' b1', et si vous n'avez que deux valeurs dans 'a3', le résultat sera différent. (Si vous obtenez un scan de table complet est une question distincte). –

+0

En fait, cela dépend de votre logique de requête et de la structure de votre base de données. Dans votre exemple, Equal est plus rapide parce que l'opérateur égal correspond directement à la chaîne et non l'équivalent. – Niks

Répondre

3

Le quelqu'un a à peu près raison.

Même lorsque deux requêtes projettent exactement les mêmes lignes d'une table, une requête utilisant un prédicat sur une colonne ayant seulement deux valeurs, "1" se produisant une fois et "2" constituant le reste est plus probable d'utiliser un index avec:

column = '1' 

qu'il est avec:

column != '2' 

Même quand il y a un histogramme pour identifier le biais que vous seriez mieux avec un signe égal.

http://sqlfiddle.com/#!4/070db/3