Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 05/09/2011, 17h08   #1
Candidat au titre de Membre du Club
 
Homme Arnaud
Étudiant
Inscription : mars 2011
Messages : 60
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 60
Points : 11
Points : 11
Par défaut Erreur : Recherche FULL TEXT

Bonjour,

Je souhaiterai faire une recherche de mot clés dans mon champs "Type" afin d'afficher dans une autre colonne "Type_Desc" le mot VOITURE si un des termes est trouvés. Je "complique" ensuite la requête si le mot est trouvé en vérifiant qu'il y a bien tel mot ou tel mot dans le champs Reference

Je pensais faire la requête suivante mais je m'apercois qu'une erreur est générée du fait de l'utilisation de CONTAINS :

La requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
UPDATE TEMP SET Type_Desc =
(CASE 
	WHEN (	((Type)='VT' AND CONTAINS (Reference, '%CLIO% OR %mégane% OR %Ferrari% OR %golf% OR %Golf% OR %GOLF%'))
		OR	((Type)='VHQ' AND CONTAINS (Reference, '%CLIO% OR %mégane% OR %Ferrari% OR %golf% OR %Golf% OR %GOLF%'))
		OR	((Type)='VEHICULE' AND CONTAINS (Reference, '%CLIO% OR %mégane% OR %Ferrari% OR %golf% OR %Golf% OR %GOLF%'))
		OR  (Type)='A'  
		OR	(Type)='4' ) 
	THEN 'VOITURE'
	ELSE 'MOTO'
END
)
J'ai le message d'erreur suivant :

Code :
1
2
 
Impossible d'utiliser le prédicat CONTAINS ou FREETEXT sur table ou vue indexée 'TEMP', car il n'y a pas d'index de texte intégral.
J'ai du coup chercher un peu et je suis tombé la dessus pour SQL Server 2005: http://labs.bewise.fr/Article/Mise-e...L-Server-2005/

Seulement je me demande si c'est bien cette solution que je dois adopter et adapter pour ma base SQL Server 2008 ?
Ou il y a t-il d'autre solution ? Je pourrais utiliser le LIKE dans ma requête mais je suis obligé de préciser à chaque fois la colonne...

Code :
(Reference) LIKE %CLIO% OR (Reference) LIKE %Clio%  OR (Reference) LIKE...
Voila, merci de votre aide

Cordialement bibouex
bibouex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 17h59   #2
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Le message est explicite : il faut indexer ton champ reference avec un index fulltext.

Vu le nom de ta table, ça ne me semble pas une bonne idée : l'indexation fulltext est :
1/ lente
2/ consommatrice
3/ non fiable : si tu interroge l'index alors qu'il n'a pas fini sa mise à jour, tu n'auras pas de résultat OU des résultats qui ne contiennent pas ce que tu cherches !

Donc à réserver pour des tables de contenu qui ne changent pas énormément (référentiel produit, etc.)
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 18h00   #3
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Il reste donc le like, sâchant que c'est :
- lent
- case sensitive
- que ça suit pas les index
- qu'à mon avis, tu devrais de débrouiller pour savoir si c'est une voiture ou une moto AVANT d'allimenter la table
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 18h04   #4
Candidat au titre de Membre du Club
 
Homme Arnaud
Étudiant
Inscription : mars 2011
Messages : 60
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 60
Points : 11
Points : 11
Avant d'alimenter ma table ? C'est ce que je veux faire en travaillant sur la table TEMP avant le chargement de mes données dans mon Datawarehouse...

Bon j'ai pas expliquer tout mon projet mais j'ai fait un petit post juste avant sur le forum justement pour comprendre la manière d'agir au niveau de l'ETL...

http://www.developpez.net/forums/d11...uestion-t-etl/

Ma table TEMP n'est autre qu'une table de préparation de mes données donc en gros je voulais rajouter un champs dans TEMP pour faire le tri afin que deriere dans mon DW je puisse faire la jointure sur ma dimension TYPE_VEHICULE, dans laquelle j'ai VOITURE ou MOTO

Enfin c'est un exemple que j'ai donnée, c'est pas les vrai nom de table et de champs car sinon ca devenait trop compliqué...
bibouex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 09h10   #5
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Il reste donc le like, sâchant que c'est :
- case sensitive
- que ça suit pas les index
depuis quand le like ou le = sont case sensitive? cela dépend de la COLLATION!
Le like peut très bien tirer partie d'un index....
Citation:
lente
La recherche FULLTEXT est tout sauf lente!!!
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 09h27   #6
Candidat au titre de Membre du Club
 
Homme Arnaud
Étudiant
Inscription : mars 2011
Messages : 60
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 60
Points : 11
Points : 11
Citation:
Envoyé par iberserk Voir le message
La recherche FULLTEXT est tout sauf lente!!!
Si je peux me permettre je pense que je vais suivre tes conseils (de par ton expérience et les nombreuses participation sur ce forum qui en on aidé plus d'un )
De toute façon je me suis "planté" dans l'utilisation de SSIS puisque je l'utilise principalement comme un ordonnanceur et non pas en vrai Data Flow...

J'ai juste utilisé la tache de flux de données afin d'extraire mon fichier source puis je l'envoie dans une table TEMP. Sur cette dernière j'ai crée toute une succession de tâches de requêtes SQL qui nettoient, modifient et ajoutent des données avant de tous dispatcher dans ma table des faits et mes dimensions...
Donc ne comprenant pas très bien comment marche chaque module SSIS et comprenant de mieux en mieux le langage SQL je crois que le plus simple est d'utiliser l'indexation sur mon champ "Reference", enfin je crois ?

Si vous avez d'autres conseils je suis preneur
bibouex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 10h45   #7
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Attention, lis ma réponse, je ne fais que répondre à StringBuilder pour le coups...

Si c'est une table de "travail" utilisé comme table intermédiaire dans ton lot SSIS l'indexation FULLTEXT n'est peu être pas la meilleur solution du fait de l'indexation asynchrone...

La colonne indexée est elle grosse?Combien de lignes as tu? le mieux est que tu test...

Pour ma part l'indexation de plusieurs milliers de ligne est instantannée...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 11h00   #8
Candidat au titre de Membre du Club
 
Homme Arnaud
Étudiant
Inscription : mars 2011
Messages : 60
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 60
Points : 11
Points : 11
Je viens de faire le test sur 130 mille lignes et cela est instantanée également...
Donc je pense que ça posera pas de problème pour le moment, par contre du coup quand je veux faire ma recherche avec CONTAINS j'ai un problème pour trouver une chaine de caractère avec un espace !?

je cherche toute les valeurs commençant par un chiffre entre 1 et 200 puis avec/sans espace suivi de la lettre A

Du style :
  • 1 A
  • 1 a
  • 1A
  • 1a
  • 6 A
  • 6A
    ...

Code :
CONTAINS (Reference, '%CLIO% OR %mégane% OR [1-200]escapeA'))
Mais le CONTAINS ne comprend pas les caractères [] et je suis pas sur que ce soit bon par ailleur...
bibouex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 12h09   #9
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Citation:
Envoyé par iberserk Voir le message
depuis quand le like ou le = sont case sensitive? cela dépend de la COLLATION!
Oui, sauf que généralement, on met une collation CS, car on a plus souvent besoin d'être CS que CI.

Citation:
Envoyé par iberserk Voir le message
Le like peut très bien tirer partie d'un index....
Oui, quand on fait un like 'toto%', ou éventuellement un like '%toto', mais un like '%toto%', je ne suis pas certain que l'utilisation d'un index soit possible/pertinente.

Citation:
Envoyé par iberserk Voir le message
La recherche FULLTEXT est tout sauf lente!!!
Je ne parlais pas de la recherche, mais de l'indexation.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 12h13   #10
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Attention aux temps de réponse sur l'environnement de DEV !

L'indexation fulltext est asynchrone.

Cela veut dire que rien ne t'empêche d'interroger l'index alors qu'il n'est pas reconstruit.

Et dans ce cas, c'est vite catastrophique.

Sur les grosses bases de production, on a rarement des index full text qui se construisent tous seuls, on attend généralement un moment calme de la journée pour le faire... Et si la base est fortement sollicité, elle le fera pour tout de toute façon, même si tu le force en automatique !

Donc inserrer 130 000 lignes d'un coup et faire des select dessus dans la milli-seconde qui suit, c'est suicidaire en fulltext.

Il vaut mieux dans ton cas sacrifier un peu de CPU et faire un LIKE, qui donnera un résultat exact à tout les coups.

J'insiste sur le fait que même si ta requête renvoie quelquechose, ce qu'elle renverra ne sera peut-être pas bon !

J'ai anciennement fait un site web qui utilisait fulltext pour faire des recherches dans des articles, et c'était assez marrant de voir que parfois, à 5 minutes d'interval, j'avais pas du tout les mêmes résultat... et parfois n'importe quoi car un article avait été modifié et interrogé avant la reconstrution de l'index, et on avait donc un article qui s'affichait dans la recherche, alors qu'il ne contenait pas du tout les mots recherchés !
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 11h57   #11
Candidat au titre de Membre du Club
 
Homme Arnaud
Étudiant
Inscription : mars 2011
Messages : 60
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 60
Points : 11
Points : 11
Merci bien a vous deux.
J'ai finalement fait l'indexation étant donné que mes changements en base ne sont que mensuels...
bibouex 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 17h14.


 
 
 
 
Partenaires

Hébergement Web