2010-09-09 6 views
3

J'utilise SQL Server 2008 Enterprise. Maintenant j'ai deux modèles pour implémenter la même fonction (pour voir si la colonne zoo1 ou zoo2 ou zoo3 contient du texte, dans le modèle 1, je fusionne le contenu de zoo1, zoo2 et zoo3 pour former une nouvelle colonne appelée zoo), je pense que le premier Le pattern est toujours de meilleure performance (j'ai fait quelques expériences) de mon expérience. Mais je ne suis pas sûr si j'ai raison, et quelle est la raison interne pour laquelle le motif 1 est toujours de meilleure performance?Problème d'instruction SQL Server

Motif 1:

Select foo, goo from tablefoo where zoo like LIKE '%'[email protected]+'%' 

Motif 2 (zoo est une colonne qui je fusionne le contenu de la colonne zoo1, zoo2 et zoo3 pour générer):

Select foo, goo from tablefoo where (zoo1 like LIKE '%'[email protected]+'%') OR (zoo2 like LIKE '%'[email protected]+'%') or (zoo3 like LIKE '%'[email protected]+'%') 

grâce à l'avance, George OU

+1

Question très intéressante. –

+1

Comment construisez-vous la colonne combinée, 'zoo'? Utilisez-vous une vue, et si oui, est-elle indexée? Utilisez-vous une colonne calculée, et si oui, est-elle persistante? BTW, votre requête peut être vulnérable aux attaques SQL-Injection. –

+1

J'ai déjà répondu à une question similaire cette semaine http://stackoverflow.com/questions/3649673/what-indices-should-be-created-to-optimize-sql-query-with-multiple-or- conditions/3656415 # 3656415 Les indices SQL tombent à peu près avec des requêtes Ou a ou b ou c est préférable de faire des unions et de séparer les requêtes – u07ch

Répondre

3

OU presque toujours tue la performance.

Dans ce cas, il s'agit de 3 colonnes à analyser vs 1 colonne à analyser.

Dans les deux cas, parce que vous avez un leader% alors un indice ne sera pas utilisé de toute façon (il peut être scanner car il est couvre les colonnes zoo de%)

La colonne 1 est simplement moins mauvais que les 3 colonne OU requête. Pas mieux".

+0

Donc, la conclusion est un peu d'amélioration de l'utilisation de non OU? – George2

+1

@George: dans ce cas, oui. Dans d'autres cas, ce serait probablement mieux. – gbn

+0

Utiliser leading% n'utilise pas l'index, pourquoi? – George2