0
votes

Améliorer les performances de la requête SQL avec dynamique comme

J'ai besoin de rechercher des personnes dont le prénom est inclus (une sous-chaîne de) dans le prénom de quelqu'un d'autre.

SELECT DISTINCT top 10 people.[Id], peopleName.[LastName], peopleName.[FirstName]       
    FROM [dbo].[people] people
    INNER JOIN [dbo].[people_NAME] peopleName on peopleName.[Id] = people.[Id]
    WHERE EXISTS (SELECT * 
                        FROM [dbo].[people_NAME] peopleName2 
                        WHERE peopleName2.[Id] != people.[id] 
                            AND peopleName2.[FirstName] LIKE '%' + peopleName.[FirstName] + '%')


11 commentaires

C'est ce qui se passe lors de l'utilisation de comme avec une carte générique sur le côté gauche ... Vous pouvez essayer de créer un index sur gens_name (prénom) mais il ne fera probablement pas de différence de performance réelle.


Cette requête est identique à celle-ci à celle-ci Sélectionnez le top 10 distinct [ID], PN. [Nom], Pn. [Prénom] [DGO]. [Personnes] P ROCIER INTERNE [DGO] [NOME ] pn sur pn. [id] = p. [id]


Joindre intérieur et existe sur la même table?


J'ai besoin d'amener les personnes avec nom inclus dans au moins un nom de personnes. Exemple Si j'ai Bob and Bobby, Bob sera un résultat. J'ai essayé d'ajouter un index mais aucune différence :(!


Index de texte intégral ?


Je n'ai pas essayé de créer un index de texte complet, cela ferait-il une grande différence? Je suis réticent à créer un index car il s'agit d'une chose statistique une chose que je dois faire.


Vous devez enquêter sur la situation, mais c'est le but d'un indice de texte complet ... Trouver des morceaux de texte aléatoires de manière performante.


En réalité, l'ajout de la valeur codée sans code papier n'est pas ce qui l'accélère, comme "%% quelque chose (commence par%) sera lent. La raison pour laquelle votre valeur codée est rapide est que cela trouve 10 matchs au début de l'analyse.


C'est une table physique


Quelle version de SQL Server utilisez-vous?


Studio de gestion de Server Microsoft SQL Server 11.0.2100.60


4 Réponses :


1
votes

C'est un problème difficile. Je ne pense pas que l'index complet de texte vous aidera, car vous souhaitez comparer deux colonnes.

qui ne laisse pas de bonnes options. Une possibilité est de mettre en œuvre ngams . Ce sont des séquences de caractères (disons, 3 d'une rangée) qui proviennent d'une chaîne. De mon prénom, vous auriez: xxx

alors vous pouvez les utiliser pour une correspondance directe sur une autre colonne. alors vous devez faire du travail supplémentaire pour voir si le nom complet d'une colonne correspond à une autre. Mais les ngrams devraient réduire considérablement l'espace de travail.

En outre, la mise en œuvre de ngams nécessite des travaux. Une méthode utilise un déclencheur qui calcule les ngams pour chaque nom, puis les insère dans une table de ngram.

Je ne sais pas si tout ce travail vaut l'effort de résoudre votre problème. Mais il est possible d'accélérer la recherche.


1 commentaires

C'est intéressant, mais en effet, ce n'est pas une solution possible pour moi. Merci quand même.



0
votes

Avez-vous essayé une jointure au lieu d'une requête corrélée? Pré> xxx


1 commentaires

Merci pour votre réponse. Je l'ai essayé et il est encore plus lent parce qu'il y a beaucoup de matchs.



0
votes

Vous pouvez le faire,

select * from CTE


1 commentaires

Merci pour la réponse, votre solution n'est pas plus rapide que la première.



1
votes

Jetez un oeil à ma réponse à propos de l'utilisation de comme code> Opérateur Ici

Cela pourrait être assez performant si vous utilisez des astuces p>

Vous pouvez gagner beaucoup de vitesse si vous jouez avec une classement, essayez ceci: p>

SELECT TOP 10 p.[Id], n.[LastName], n.[FirstName]
FROM [dbo].[people] p
INNER JOIN [dbo].[people_NAME] n on n.[Id] = p.[Id]
INNER JOIN [dbo].[people_NAME] n2 on 
    lower(n2.[FirstName]) collate latin1_general_bin 
    LIKE 
    '%' + lower(n1.[FirstName]) + '%' collate latin1_general_bin
GROUP BY n1.[Id], n1.[FirstName]
HAVING COUNT(*)>1


1 commentaires

Merci pour votre réponse, je vais vérifier cela. En attendant, je ferme ce post. J'ai beaucoup d'exérétions à faire :).