Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/12/2006, 11h10   #1
Membre régulier
 
Inscription : novembre 2004
Messages : 160
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 160
Points : 95
Points : 95
Par défaut Firebird Probleme like

Bonjour,


j'ai un probleme avec toutes mes requetes like voici un exemple :

Code :
SELECT CLNOM FROM CLIENT WHERE CLNOM LIKE 'A%';
Dans ce cas firenbird utilise bien l'index qui est sur la colonne nom.
Maintenant si je fait la meme chose avec une variable :
Code :
SELECT CLNOM FROM CLIENT WHERE CLNOM LIKE :STR;
Dans ce cas firebird n'utilise plus l'index (:STR= 'A%')

J'ai le meme problem en fb 1.5 et 2.0.

Je trouve ce probleme vraiment problématique car dans les procédures stockée ou l'on passe les chaine de recherches on est obligé de passser par des variables !

Merci d'avance.
le-roy_a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 11h41   #2
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Si par bonheur, tu recherches tout le temps une chaine commençant par xxx, tu peux essayer avec
Code :
WHERE CLNOM STARTING WITH 'A';
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 12h38   #3
Membre régulier
 
Inscription : novembre 2004
Messages : 160
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 160
Points : 95
Points : 95
Merci mais je connaissait starting with mais ca ne correspond pas a ce que je cherche.

Ca vous parait pas aberent que le like avec variable ne prenne pas l'index ?
le-roy_a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 13h20   #4
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Sinon, tu peux toujours forcer l'utilisation du PLAN qui va bien pour le select (cf la doc.)
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 13h42   #5
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
Citation:
Envoyé par le-roy_a
Merci mais je connaissait starting with mais ca ne correspond pas a ce que je cherche.

Ca vous parait pas aberent que le like avec variable ne prenne pas l'index ?
non, parce que dans ce cas, on ne peux pas savoir si tu vas faire un LIKE 'A%' qui sera en interne transformé STARTING WITH ou si tu vas faire un LIKE '%A' ou LIKE '%A%' et donc on prépare le plus petit dénominateur commun
tous les moteurs sql ont ce comportement
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 14h29   #6
Membre régulier
 
Inscription : novembre 2004
Messages : 160
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 160
Points : 95
Points : 95
Ok mais dans le cas ou je fais Like 'A%B%' il serait intéréssent d'utiliser l'index.
De plus

> tous les moteurs sql ont ce comportement

Oracle n'a pas ce comportement :
tous les moteurs sql ont ce comportement :
Extrait de la doc officiel :
Citation:
Pattern Matching on Indexed Columns

When you use LIKE to search an indexed column for a pattern, Oracle can use the index to improve the statement's performance if the leading character in the pattern is not "%" or "_". In this case, Oracle can scan the index by this leading character. If the first character in the pattern is "%" or "_", then the index cannot improve the query's performance because Oracle cannot scan the index.
Car effectivement il suffit de regarder si le premier caractere n'est pas un %

Mais peut etre quelque chose m'echappe ?
le-roy_a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 15h47   #7
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
ce qui t'échappe c'est que firebird et Oracle ont le même comportement
lit bien
test, tu verras
avec des données en "dur" on peut optimiser, avec des paramêtres non
car la requête est préparée avant de recevoir les paramêtres
donc je confirme, tous les moteurs ont le même comportement
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 15h52   #8
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Citation:
Envoyé par le-roy_a
Oracle n'a pas ce comportement
L'extrait de la doc officielle que tu fournis ne dit pas autre chose que ce qu'avance makowski...
Citation:
Quand on utilise LIKE..... Oracle peut utiliser l'index....si le 1er caractère n'est pas '%' ou '_'...
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 17h05   #9
Membre régulier
 
Inscription : novembre 2004
Messages : 160
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 160
Points : 95
Points : 95
Ok merci beaucoup je commence a comprendre mais le probleme c'est existe t'il une solution pour faire cela en firebird ?

Car forcer le plan ca ne marche pas en fb1.5 :
select USERNAME FROM USERS WHERE USERNAME Like :df
PLAN (USERS INDEX (USERS_IDX4))

Erreur :
index cannot be used in the specified plan
.
index USERS_IDX4 cannot be used in the specified plan.

Mais si je remplace like par egal il n'y a plus de probleme.

Donc comment faire ?
le-roy_a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 21h16   #10
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Il faut commencer par savoir quel plan est utilisé en cas de recherche sur "%A".

Ensuite, peut-être qu'en testant le format du paramètre (A% ou %A) dans la PS, tu conditionnes l'exécution d'une requète comportant le plan qui va bien.
Mais, il faudra donc 2 séquences de Select dans la PS :
- 1 mentionnant le plan basé sur l'index
- 1 ne le mentionnant pas (ou mentionnant "l'autre" plan)
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2006, 12h15   #11
Membre régulier
 
Inscription : novembre 2004
Messages : 160
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 160
Points : 95
Points : 95
Le probleme est que je n'arrive pas a specifier le plan des qu'il y a un like avec variable !
le-roy_a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2006, 21h56   #12
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
ne cherche pas à spécifier le plan
si c'est dans une procedure stocké, test ton parametre si il est du type %..
alors tu fait LIKE et sinon STARTING WITH
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2006, 10h45   #13
Membre régulier
 
Inscription : novembre 2004
Messages : 160
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 160
Points : 95
Points : 95
Ok mais ca marche seulement dans un cas :

ex : A% ca marche
mais A%B ca marche pas car starting with n'accepte pas les caracteres joker !
le-roy_a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2006, 19h55   #14
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
forcément
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2006, 22h24   #15
Membre régulier
 
Inscription : novembre 2004
Messages : 160
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 160
Points : 95
Points : 95
Et existe t'il alors une solution pour un cas su type a%b% ?
le-roy_a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2006, 23h21   #16
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
dans le cas fait :
USERNAME STARTING WITH 'A' AND USERNAME LIKE '%B%'
et tu utiliseras l'index
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2006, 09h05   #17
Membre régulier
 
Inscription : novembre 2004
Messages : 160
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 160
Points : 95
Points : 95
ok merci,

Mais n'existerais t'il pas un systeme de full text search come dans oracle ? car ca serait tous de meme plus pratique !
le-roy_a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2006, 10h26   #18
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
si ça existe mais pas en standard, il y a plein de gens qui ont des solutions de ce type, tu peux même utiliser lucene avec firebird si tu veux
mais c'est tout à fait autre chose que ton petit problème
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2006, 10h44   #19
Membre régulier
 
Inscription : novembre 2004
Messages : 160
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 160
Points : 95
Points : 95
Merci,

mais pour info ce n'est pas du tout un petit problème certe dans l'example c'est simpliste mais dans la réalité c'est tout autres choses.

merci quand meme!
le-roy_a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2006, 11h53   #20
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
bah, tu n'as que trois cas à traiter
et pour les outils dispos tu as :
http://www.codeproject.com/cs/databa...xtFirebird.asp
et aussi
http://www.ibphoenix.com/main.nfs?a=...=ibp_dotlucene
sachant que Pylucene fonctionne aussi
et que c'est prévu de faire un jour un full text search, il faut juste le temps et les sous pour le faire
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h49.


 
 
 
 
Partenaires

Hébergement Web