Amélioration des performances sur une requête de search de text alphanumérique

J'ai une table où des millions d'loggings sont là Je ne fais que postr des exemples de données. En fait, je cherche à get uniquement des données d'endossement en utilisant LIKE ou LEFT mais il n'y a pas de différence entre eux dans le time d'exécution. Y a-t-il un bon moyen d'get des données en less de time avec datatables alphanumériques? J'ai 4.4M loggings dans la table. Suggère moi

declare @t table (val varchar(50)) insert into @t(val)values ('0-1AB11BC11yerw123Endorsement'), ('0-1AB114578Endorsement'), ('0-1BC11BC11yerw122553Endorsement'), ('0-1AB11BC11yerw123newBusiness'), ('0-1AB114578newBusiness'), ('0-1BC11BC11yerw122553newBusiness'), ('0-1AB11BC11yerw123Renewal'), ('0-1AB114578Renewal'), ('0-1BC11BC11yerw122553Renewal') SELECT * FROM @t where RIGHT(val,11) = 'Endorsement' SELECT * FROM @t where val like '%Endorsement%' 

Imaginez que vous deviez find des noms dans un annuaire téléphonique se terminant par une certaine string. Tout ce que vous pouvez faire est de lire chaque nom et comparer. Cela ne vous aide pas du tout à voir où commencent les noms avec A, B, C, etc., car les caractères initiaux des noms ne vous intéressent pas, mais seulement les derniers caractères. Eh bien, la seule chose que vous pourriez faire pour accélérer cela est de requestr à des amis de vous aider et chaque personne ne scanne qu'une gamme de pages. Dans un SGBD c'est pareil. Le SGBD effectue un balayage de table complet et le fait parallélisé si possible.

Si toutefois vous aviez un annuaire téléphonique énumérant les mots en arrière, de sorte que vous verriez quels mots se terminent par A, B, C, etc., cela aiderait certainement. Dans SQL Server: créez une colonne calculée sur la string inverse:

 alter table t add reverse_val as reverse(val); 

Et ajoutez un index:

 create index idx_reverse_val on t(reverse_val); 

Puis interrogez la string avec LIKE. Le SGBD doit remarquer qu'il peut utiliser l'index pour accélérer le process de search.

 select * from t where reverse_val like reverse('Endorsement') + '%'; 

Cela dit, il semble étrange que vous vous intéressiez à la fin de vos cordes. Dans une bonne database, vous stockez des informations atomiques, par exemple vous ne stockez pas le nom et la date de naissance d'une personne dans la même colonne ('John Miller 12.12.2000'), mais plutôt dans des colonnes séparées. Bien sûr, il arrive que vous stockiez des noms et que vous vouliez searchr des noms commençant par, se terminant par, contenant des sous-strings, mais c'est une chose rare après tout. Vérifiez votre colonne et déterminez si son contenu doit être des colonnes séparées. Si vous aviez la string ('Endorsement', 'Renewal', etc.) dans une colonne séparée, cela accélérerait vraiment la search, car tout ce que vous auriez à faire est de requestr where val = 'Endorsement' et avec un index sur cette colonne, c'est une tâche super simple pour le SGBD.

essayez charindex ou patindex:

 SELECT * FROM @tt WHERE CHARINDEX('endorsement', t.val) > 0 SELECT * FROM @tt WHERE PATINDEX('%endorsement%', t.val) > 0 
 CREATE TABLE tbl (val varchar(50)); insert into tbl(val)values ('0-1AB11BC11yerw123Endorsement'), ('0-1AB114578Endorsement'), ('0-1BC11BC11yerw122553Endorsement'), ('0-1AB11BC11yerw123newBusiness'), ('0-1AB114578newBusiness'), ('0-1BC11BC11yerw122553newBusiness'), ('0-1AB11BC11yerw123Renewal'), ('0-1AB114578Renewal'), ('0-1BC11BC11yerw122553Renewal'); CREATE CLUSTERED INDEX inx ON dbo.tbl(val) SELECT * FROM tbl where val like '%Endorsement'; --LIKE '%Endorsement' will give better performance it will utilize the index well efficiently than RIGHT(val,ll)