2017-09-23 6 views

Répondre

0

Je vous entends dire que dans la clause JOIN, vous voulez 'abcdef'! = 'Abcd', et veulent aussi 'ABCD' == 'abcd'.

L'optimiseur principal ne peut pas "voir à travers" des fonctions telles que lower(), ce qui empêchera l'exploitation de certains index. Succinctement, "les fonctions désactivent les index".

Créer une nouvelle colonne dérivée, utilisez la commande UPDATE pour stocker les noms de cas-fracassée, et l'indice sur elle. Faites ensuite une équi-jointure simple.

EDIT: Vous RÉVISÉ votre question pour dire A.name == B.tag_name est le équi-jointure d'intérêt, où « égal » doit avoir une sémantique insensibles à la casse. Mais l'optimiseur de requêtes "ne peut pas voir à travers" la fonction lower() - il désactiverait tout index. Nous voulons prendre en charge les jointures à haute vitesse en utilisant votre test d'égalité personnalisé, et nous utiliserons un peu d'espace disque pour le faire.

Table Alter A pour ajouter une colonne varchar name1.

De même, modifiez la table B pour ajouter une colonne tag_name1.

Ce sont des colonnes dérivées qui seront utilisées uniquement pour la condition d'équi-jointure. Mettez des données en majuscules dans ces fichiers: update A set name1 = lower(name);

De même pour la table B. Vous pouvez tronquer de longues chaînes ou modifier les données pour les adapter à votre notion d'égalité spécifique à l'application.

veiller à ce qu'un a un indice de mentionner name1, et B a une pour tag_name1.

Maintenant, votre clause ON demande juste name1 == tag_name1.

+0

Merci (pouvez-vous préciser plus), en fait dans une table j'ai deux lignes comme « abcdef » et « abcdef » et hash sont stockés dans une autre table quand je me joins les deux tableaux, il combine les résultats. Le jeu de résultats résultant combine tous les hachages pour les deux lignes: def tag_info (db, tag): rows.tag_info = db.query (A.nom, A.time_type, A.objet_type, A.synchronisation, ....) \ \t \t \t \t .outerjoin (B, A.name == B.tag_name) \ \t \t \t \t .filter (A.name == tag) \ \t \t \t \t .order_by (desc (B. depuis)). first() –

+0

"EDIT: Vous avez révisé votre question pour dire A.name == B.tag_name est l'équi-joint d'intérêt, où" equal "devrait avoir une sémantique insensible à la casse" Il devrait être sensible à la casse insensible à la casse –

+0

Merci pour les conseils. C'est résolu maintenant. –