Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
899 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Oracle] Problème de performances Instr et CLOB

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Oracle] Problème de performances Instr et CLOB

n°867101
Arjuna
Aircraft Ident.: F-MBSD
Posté le 07-10-2004 à 15:05:39  profilanswer
 

Bon, je suis dans la merde...
 
Je suis en train de faire un site web dont la base de données contient des produits dont les descriptions sont traduites en 5 langues, ainsi qu'un certain nombre d'autre critères (dépôts dépendants du profil client, etc.)
 
Alors voilà.
Je dois faire une recherche par mots clés.
Ces mots clés doivent chercher dans tout ce qui contient du texte au niveau des traductions, de la marque, etc.
 
Du coup j'ai des tas de jointures plus ou moins complexes, qui portent sur un total de 1 500 000 lignes environs (dans les 300 000 produits traduits en 5 langues)
 
Faire des LIKE sur chaque champs au sein d'une énorme condition OR, autant de fois que j'ai de mots clés, c'est pas viable.
 
J'ai donc tenté de concaténer tous les champs "texte" et faire un unique LIKE par mot clé dessus.
Les perfs sont encore pire, car à cause de la concaténation, les indexes ne sont plus utilisés.
 
Je me suis donc résolu à me créer une table rafraîchie tous les jours contenant les données "pré-formattés".
Voici la structure :
 
CODSOC / Code société
CODPRO / Code produit
ECAT   / Code alternatif
REFPRO / Référence fournisseur
CODLAN / Code langue
NOMPRO / Nom du produit (localisé)
TXTPRO / Description du produit (localisé)
KEYWORD/ Nom + Description + Marque + codes + ...
 
KEYWORD est un CLOB (comme un LONG, mais formatté suivant le charset utilisé pour les types caractères).
 
Le LIKE ne fonctionne pas sur ce type de champs.
Par contre, je peux faire un INSTR() qui me renvoie une valeur > 0 si la chaîne est trouvée.
 
Banco !
 
Ben non.
 
Perfs toujours aussi pourrie, alors que cette fois je n'ai plus de jointures.
Le INSTR est donc encore plus lent que le LIKE.
 
Comment faire pour pallier à mon problème ? :sweat:
 
Je me suis renseigné auprès des DBA, il nous est impossible de passer par un INDEX de type TEXT, car il faut installer l'applicatif Oracle Text, qui est bien trop cher (et surtout on n'a plus le temps de l'implémenter)
 
Personne n'a une idée ?
Pour ceux qui font des forums, vous avez bien un moteur de recherche ? Comment vous faites ? :sweat: (ouais, je sais, c'est pas Oracle que vous utilisez mais bon :/)

mood
Publicité
Posté le 07-10-2004 à 15:05:39  profilanswer
 

n°867112
Arjuna
Aircraft Ident.: F-MBSD
Posté le 07-10-2004 à 15:12:18  profilanswer
 

En gros :
 
select search.codpro, search.refpro, search.nompro, search.txtpro  
from  
search  
where search.codsoc = 0  
and search.codlan = 'ENG'  
and not exists (select null from exclusion where exclusion.codsoc = search.codsoc and exclusion.codpro = search.codpro and exclusion.codpay = 'FR')  
and instr(search.keyword, upper('upp')) > 0  
and instr(search.keyword, upper('hd')) > 0  
order by nompro
 
Ca met 2 minutes et 41 secondes pour retourner :
 
1A00473 UPP-110HD PAPER,UPP110HD,SONY,110MMX20M A6,220SHEETS BOX OF5ROLLS,GLOSSY,FOR UPP811 UPP850 UPP860 UPP890ü          
1A04153 UPP-210HD PAPER,UPP210HD,SONY,210MMX25M, BOX OF 5 ROLLS 84SHEETS,GLOSSY,FOR UP960 UP980          
1A00065 UPP-216HD PAPER,UPP216HD,SONY,216MMX25M, BOX OF 5 ROLLS 30 SHEETS,GLOSSY,FOR UP910/930          
2S071080614 71080614 PRINTERPAPIER SONY UPP 110-HD Printerpapier Sony UPP 110-HD            
2S010650121 10 650 121 SONY PRINTER PAPIER UPP 110 HD Sony Printer Papier UPP 110 HD11cm x 20m          
2S01A00473 1A00473 SONY UPP-110HD DRUCKERPAPIER Sony UPP-110HD DruckerpapierPCK = 5 Rollen   110mmx20m          
2S01A04153 1A04153 SONY UPP-210 HD DRUCKERPAPIER Sony UPP-210 HD DruckerpapierPCK = 5 Rollen   210mmx25m          
2S01A00065 1A00065 SONY UPP-216HD DRUCKERPAPIER Sony UPP-216HD DruckerpapierPCK = 5 Rollen   216mmx25m          
2S0UPP216HD UPP 216 HD SONY VIDEOPRINTER PAPIER Sony Videoprinter Papier216mm x 25m (VE = 5 Stck)          
 
C'est vraiment pas gérable :/
 
Surtout que le site web est configuré pour planter si une page met plus de 15 secondes à charger :cry:

n°867113
Arjuna
Aircraft Ident.: F-MBSD
Posté le 07-10-2004 à 15:13:48  profilanswer
 

PS: Si je vire les "Instr()", la requête me retourne la liste des produits en anglais qui sont vandables en France en 72 ms (pour 280 000 lignes ça va...)

n°867223
Arjuna
Aircraft Ident.: F-MBSD
Posté le 07-10-2004 à 17:10:48  profilanswer
 

Personne n'a une idée ?
 
Je viens de m'appercevoir qu'un LIKE marche aussi sur le type CLOB.
Du coup c'est mieu, car ça va plus vite.
 
Mais ça met toujours plus d'une minute, et c'est beaucoup trop lent :sweat:
 
Je ne peux évidement pas indexer un champ de type CLOB, et vu qu'il contient régulièrement plus de 10 000 caractères, ça marche pas.
 
Comment faire ? J'ai vraiment besoin d'un coup de main :cry:

n°867244
Arjuna
Aircraft Ident.: F-MBSD
Posté le 07-10-2004 à 17:47:51  profilanswer
 

Grrrrr... Sacrés DBA :o
 
Ouf, sauvé :bounce:
 
J'ai contact le chef de celui qui voulait pas, et il n'a même pas tiqué, il a accepté directement d'installer les options Oracle Text :bounce:
 

Citation :


Sylvain/Medi... hello mandar
Mandar/Me... hello
Sylvain/Med... I would like to know if it's possible to activate the "Oracle Intermedia" functions on ACODBT01 database. In fact, we have a very big performance issue while doing search queries on our web site, and we can't see other solution than using a full text index search. (using a TEXT index and CONTAINS opperator)
Mandar/Me... Do you mean enable "oracle text" option for your database ?  
Sylvain/Med... Yes.
In fact, currently, we have this query that will be ran each time a user looks for a product (only way to get access to the online catalog) :

Code :
  1. select search.codpro, search.refpro, search.nompro, search.txtpro
  2. from search
  3. where search.codsoc = 0
  4. and search.codlan = 'ENG'
  5. and not exists (select null from exclusion where exclusion.codsoc = search.codsoc and exclusion.codpro = search.codpro and exclusion.codpay = 'FR')
  6. and search.keyword like '%SONY%'


Sylvain/Med... It takes near than 2 minutes so it raises a timeout error on the website.
Mandar/Me... I don't know which packages I need to run. May be I can recreate the database with "Oracle Text" option and re-import your existing stuff into new one. Is it OK for you ?
Sylvain/Med... Christophe ask me if we can create a new instance for test, instead of destroying now our current database
Mandar/Me... ACODBT02 ?
Sylvain/Med... Yes. And if it works, we just have to destroy the 01
Mandar/Me... with Oracle Text option ?
Sylvain/Med... yes
Mandar/Me... Ok we will create the db by tomorrow  
Sylvain/Med... OK. Thank you very much
Mandar/Me... no pbs


 
Bon, une journée de perdue (enfin pas complètement, j'ai fait d'autres trucs quand même :D)


Message édité par Arjuna le 07-10-2004 à 17:48:09
n°867246
Arjuna
Aircraft Ident.: F-MBSD
Posté le 07-10-2004 à 17:49:30  profilanswer
 

Bon, ben pour demain, j'espère que qq1 d'entre vous sait se servir de l'option Text d'Oracle, parceque j'y connais rien [:spamafote]


Message édité par Arjuna le 07-10-2004 à 17:49:36
n°871199
Arjuna
Aircraft Ident.: F-MBSD
Posté le 12-10-2004 à 11:07:53  profilanswer
 

C'est hallucinant...
 
Avec tous les gens qui bossent sur des forums, vous allez me faire gober qu'une de vous ne s'est jamais posé la question d'un moteur de recherche sur un grand volume de données ?
 
C'est quand même pas la lune que je demande. Là je suis bloqué avec Oracle qui plante carrément maintenant en faisant les requêtes (erreur d'espace dans les tables temporaires utilisées en interne pour les requêtes)
 
:sweat:

n°871211
pains-aux-​raisins
Fatal error
Posté le 12-10-2004 à 11:16:41  profilanswer
 

[:drapal] C'est l'objet de mon tout prochain taf Arjuna. Désolé de ne pas pouvoir te t'aider présentement mais c'est clair qu'on va s'entendre ;)

n°871492
Arjuna
Aircraft Ident.: F-MBSD
Posté le 12-10-2004 à 14:53:26  profilanswer
 

Bon, en plus y'a le directeur informatique au niveau Europe qui ne voulais pas qu'on utilise ça.
Alors j'ai dit, "puisque c'est comme ça, et qu'on n'a pas de solution, on va faire un batch qui va générer 1 300 000 fichiers toutes les nuits nommés par le code des produit, avec comme contenu les descriptions des fichiers, et on va utiliser Index Server (service natif de Windows Server) pour faire les recherches. Ca va être merdique, mais au moins ça marchera."
 
Du coup ça l'a calmé, là ils sont en train de tester la charge nécessaire pour le module Oracle Text... J'espère que c'est pas trop gourmand, parceque s'il faut upgrader le serveur Sun pour ça, on est très mal, ça va coûter bombom de rajouter des CPU et de la mémoire :sweat:

n°871620
pains-aux-​raisins
Fatal error
Posté le 12-10-2004 à 16:04:02  profilanswer
 

En même temps, t'es sûr que Oracle Text va résoudre ton problème de perf ?

mood
Publicité
Posté le 12-10-2004 à 16:04:02  profilanswer
 

n°871652
Arjuna
Aircraft Ident.: F-MBSD
Posté le 12-10-2004 à 16:25:33  profilanswer
 

Normalement, c'est fait pour, j'espère oui... :sweat:

n°871654
Arjuna
Aircraft Ident.: F-MBSD
Posté le 12-10-2004 à 16:25:56  profilanswer
 

En tout cas ça peut pas être pire que des LIKE dans des CLOB [:spamafote]


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Oracle] Problème de performances Instr et CLOB

 

Sujets relatifs
[PHP]probleme liste deroulante sous IEProbleme avec la fonction val()
[VB] problème listboxProbleme avec mes evenements
probleme avec la longueur de la page de mon site??triggers base de données oracle
Aux amateur de difficultés - Problème de hauteur de cellulesProbleme entre les map area et du php
Problème d'enregistrement ACCESS via site Webtables temporaires sous Oracle
Plus de sujets relatifs à : [Oracle] Problème de performances Instr et CLOB


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR