2011-06-15 2 views
1

J'essaie d'optimiser une requête Oracle qui ressemble à ceci:Optimizing String-Recherche Oracle Interrogation

select * from upcTable where upc like '%567%' 

La requête est rapide pour les petits termes de recherche tels que 567, mais il peut obtenir jusqu'à 15 chiffres dans lequel il peut prendre ~ 1,5 secondes. Y a-t-il un moyen d'accélérer cela? le nombre de termes si peu près le même, mais le premier exemple est un peu plus rapide

J'ai essayé de faire quelque chose comme

select * from 
(select * from rldb.productmaster where upc like '%567%') 
where upc like '%380%' 

select * from rldb.productmaster where upc like '%567380%' 

Dans ce cas,. Cependant en utilisant la même technique pour 15 chiffres, c'est un peu plus rapide mais encore trop lent. Vous n'utiliserez aucun index faisant '% 123%' (% d'avance)

+1

Il n'y a aucune raison pour que '% 567%' soit plus rapide que '% 567380%' pour retourner toutes les lignes (car il doit analyser le même volume de données source). Cela peut sembler plus rapide parce que le raccourci de la chaîne doit correspondre au plus grand nombre de chances de trouver des correspondances, de sorte que les premières correspondances seront retournées plus tôt. Si vous parcourez un annuaire téléphonique à la recherche de personnes avec un «J» dans leur nom, vous obtiendrez une liste de 100 plus rapidement que si vous étiez à la recherche d'un «JU» dans leur nom. –

Répondre

1

Si vous pouvez effectuer une recherche en utilisant '123%', vous pouvez profiter d'un index.

+0

C'est vrai mais je dois utiliser les deux%. L'utilisateur ne connaîtra pas complètement l'UPC, donc cette fonction est destinée à ajouter un "autocomplete" L'article UPC pourrait être de 55000 mais dans la base de données il est stocké comme 00055000 – Overload119

+0

sans aucune autre restriction, vous laissant essentiellement la recherche d'utilisateur Pour toute chaîne de n'importe quelle longueur dans le champ, la base de données devra effectuer une analyse complète pour déterminer les correspondances. – tbone

+0

Pas nécessairement vrai ... –

5

Si vous indexez la colonne comme ceci:

create index upcIndex on upcTable (upc, pk); 

(où pk est la clé primaire de la table)

alors cette requête peut effectuer une INDEX RAPIDE FULL SCAN sur cet index:

select pk from upcTable where upc like '%567380%'; 

Si vous avez vraiment besoin de toutes les colonnes (select *), vous pouvez alors essayer ceci:

select * from upcTable where pk in 
(select pk from upcTable where upc like '%567380%'); 
+0

+1, belle solution! – tbone

Questions connexes