|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Martin NadeauProgrammeur analyste Inscription : août 2011 Messages : 5 ![]() |
Ma recherche ne me retourne jamais de résultat
J'utilise sql server ! Code :
|
||
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé
![]() dba Inscription : juillet 2007 Messages : 2 523 ![]() |
Votre façon de faire est dégueulasse et ne doit pas être très performante.
Vous feriez mieux de faire une clause différente par champs. En plus, si un des champs est null, la concaténation retournera un null... Sinon, c'est : Code :
__________________
les règles du forum - mode d'emploi du forum Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur) JE NE RÉPONDS PAS aux questions techniques par message privé. Écrire en français sur un forum est une marque minimale de respect. |
||
|
|
00
|
|
|
#3 | ||
|
Membre Expert
![]() ![]() |
Essaye ceci pour voir
Code :
|
||
|
00
|
|
|
#4 | |||
|
Invité de passage
![]() Martin NadeauProgrammeur analyste Inscription : août 2011 Messages : 5 ![]() |
Citation:
Je suis débutant en sql server alors je suis ouvert au suggestion zinzineti : Merci sa fonctionne ! |
|||
|
|
00
|
|
|
#5 | ||
|
Expert Confirmé
![]() dba Inscription : juillet 2007 Messages : 2 523 ![]() |
Citation:
Citation:
__________________
les règles du forum - mode d'emploi du forum Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur) JE NE RÉPONDS PAS aux questions techniques par message privé. Écrire en français sur un forum est une marque minimale de respect. |
||
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Martin NadeauProgrammeur analyste Inscription : août 2011 Messages : 5 ![]() |
En effet j'aimerais bien améliorer ma procédure. Cependant je ne comprend pas très bien ce que vous voulez dire par "faire une clause différente par champ" Merci!
|
|
|
00
|
|
|
#7 | |||
|
Expert Confirmé
![]() dba Inscription : juillet 2007 Messages : 2 523 ![]() |
Citation:
Code :
__________________
les règles du forum - mode d'emploi du forum Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur) JE NE RÉPONDS PAS aux questions techniques par message privé. Écrire en français sur un forum est une marque minimale de respect. |
|||
|
|
10
|
|
|
#8 | ||||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Effectivement 7gyY9w1ZY6ySRgPeaefZ a raison d'enlever les UPPER si la collation des colonnes n'est pas sensible à la casse. C'est d'ailleurs fort probablement le cas si vous avez fait une installation de SQL Server par défaut ... Dans ce cas, la collation utilisée est celle de la base de données. Et si vous ne l'avez pas spécifié lors de la création de la base de données, c'est celle de l'instance SQL Server Pour le savoir, et en supposant que vous êtes sous SQL Server 2005 ou 2008 : Code :
Code :
Code :
Dans la description de la collation, vous pouvez savoir si la collation est sensible ou non à la casse. Si elle ne l'est pas, alors l'utilisation de la fonction UPPER() est inutile et surtout contre-performante pour deux raisons : - d'abord il faut que SQL Server mette en majuscules le mot - comme il se base sur les statistiques de distribution des données dans les colonnes, l'utilisation d'une fonction sur une des colonnes participant à un prédicat (JOIN ou WHERE) devient non-cherchable. C'est la raison pour laquelle 7gyY9w1ZY6ySRgPeaefZ a qualifié votre façon de faire de dégueulasse : comme SQL Server ne peut pas prédire combien de lignes dans votre table vont vérifier le prédicat, il est obligé de lire toute la table, ce qui est très contre-performant. En changeant le prédicat de recherche par une suite de OR, c'est un peu mieux. Cela aurait été encore mieux si votre prédicat de LIKE peut être @critere + '%', parce que dans ce cas un index sur au moins l'une des colonnes du WHERE/OR aurait accéléré la requête. SQL Server aurait alors cherché toutes les lignes qui vérifient le prédicat sur cette colonne à travers l'index, puis aurait extrait le reste des données en lisant les pages de données référencées par les lignes trouvées dans l'index. Pour accélérer la recherche floue, il faut penser à un index de texte intégral. Vous pouvez l'article de SQLPro à ce sujet ici @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||||||
|
10
|
|
|
#9 |
|
Membre Expert
![]() |
Attention au FULLTEXT qui ne reproduit pas complètement le LIKE....
En combinant les deux?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Martin NadeauProgrammeur analyste Inscription : août 2011 Messages : 5 ![]() |
Merci beaucoup sa fonctionne très bien !
Cependant, la recherche me semble être devenu plus lente. Est-ce que cette nouvelle requête parcours 4 fois la base de donnée pour la recherche? Est-ce que l'ancienne requête parcourais seulement 1 fois la base de donnée en additionant les champs? Merci encore a vous pour votre aide ! |
|
|
00
|
|
|
#11 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Il faudrait pour cela que vous nous donniez :
- la structure complète de la table (colonnes et index) - la requête ... - ... et son plan d'exécution réel (que l'on obtient dans une onglet distinct de la console en pressant CTRL + M avant d'exécuter la requête) @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
|
|
#12 |
|
Expert Confirmé
![]() dba Inscription : juillet 2007 Messages : 2 523 ![]() |
Si vous aviez beaucoup de champs à Null, ça peut être une explication mais bon, là je fais Madame Soleil...
Il faudrait les informations demandées par elsuket pour être plus concret.
__________________
les règles du forum - mode d'emploi du forum Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur) JE NE RÉPONDS PAS aux questions techniques par message privé. Écrire en français sur un forum est une marque minimale de respect. |
|
|
00
|
|
|
#13 | ||||
|
Invité de passage
![]() Martin NadeauProgrammeur analyste Inscription : août 2011 Messages : 5 ![]() |
Voici la première requête (qui me semble plus rapide)
Code :
Code :
la clé primaire est CNUM et contient des valeur du genre : 0000ACR100 0000ACR105 0000AGR100 0000AGR105 ... etc. pour le plan d'exécution réel je n'arrive pas a le trouver. J'utilise sql server 2005. Je me demandais aussi si c'étais possible d'ajouter un deuxième critère de recherche avec un opérateur comme (ou, et , sans) Merci encore pour l'aide ! |
||||
|
|
00
|
|
|
#14 | ||
|
Membre Expert
![]() |
Que donne cette requête:
Code :
Pour le plan d’exécution, sous management studio à droite du bouton 'executer' vous devez avoir un bouton à cocher avant de lancer la requête... Cochez le puis lancez la requête, un deuxième onglet devrait apparaître a côté du résultat de requête avec le plan d’exécution...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
||
|
|
00
|
|
|
#15 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Le problème est le LIKE de toute façon.
Donc la seule façon que je vois pour optimiser cela est de dé-normaliser en stockant les mots qui composent les critères de recherche dans une seule colonne ... @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
Copyright © 2000-2012 - www.developpez.com