Je suis sur Oracle 11g et nous avons ces tableaux 3 clés:base de données Oracle aide l'optimisation comme la recherche
Customer - CUSTOMERID|DOB
CustomerName - CUSTOMERNAMEID|CustomerID|FNAME|LNAME
Address - ADDRESSID|CUSTOMERID|STREET|CITY|STATE|POSTALCODE
J'ai environ 60 millions de lignes sur chacune des tables et les données sont un mélange de États-Unis et au Canada population.
J'ai une application frontale qui appelle un service web et qui fait un nom de famille et une recherche partielle. Donc, ma requête a essentiellement
where CUSTOMERNAME.LNAME = ? and ADDRESS.POSTALCODE LIKE '?%'
Ils fournissent généralement les 3 premiers chiffres de la fermeture éclair.
La table d'adresse a un index sur tous les rue/ville/état/zip et un autre sur l'état et le zip.
J'ai essayé d'ajouter un index exclusivement pour le zip et forcer Oracle à utiliser cet index sur ma requête, mais cela n'a fait aucune différence.
Pour retourner environ 100 lignes (j'ai pagination pour n'en renvoyer que 100 à la fois) cela prend environ 30 secondes, ce qui n'est pas idéal. Que puis-je faire pour améliorer cela?
Vous avez besoin pour montrer votre requête.Je suppose que les tables sont jointes sur CUSTOMERID, donc CUSTOMERID s/b indexé sur chaque table. –
Le problème est que les codes postaux sont tous des chiffres (si vous parlez des États-Unis), mais ils sont stockés en tant que chaînes (pas vraiment un choix dans cela, vraiment). Même avec un index, sans plus d'aide Oracle ne sait pas qu'entre 099 et 100 il n'a pas besoin de chercher 09A et 09W. Donc, ses estimations de cardinalité seront loin. Une façon d'aider Oracle est d'ajouter des histogrammes. https://docs.oracle.com/database/121/TGSQL/tgsql_histo.htm#TGSQL366 – mathguy
Ensuite: LNAME devrait être beaucoup plus sélectif que POSTALCODE, mais vous n'avez pas mentionné d'index sur LNAME. Est-ce qu'il y a un? – mathguy