Je n'arrive pas à get des performances acceptables des catalogues FullText. Nous avons des situations où nous devons exécuter 100k + requêtes aussi rapidement que possible. Certaines requêtes utilisent FREETEXT, d'autres ne le font pas. Voici un exemple de requête
SI EXISTE (select 1 dans user_data d où d.userid=@userid et FREETEXT (*, @activities) SET @ match = 1
Cela peut prendre entre 3 et 15 secondes. J'ai besoin d'être beaucoup plus rapide <1 si possible.
J'aime la "flexibilité" de la requête fulltext en ce sens qu'elle peut effectuer une search sur plusieurs colonnes et que la syntaxe est plutôt intuitive. Je préfère ne pas utiliser une instruction Like parce que nous voulons être en mesure de faire correspondre des mots comme "Writer" et "Writing".
J'ai essayé quelques-unes des suggestions énumérées ici http://msdn.microsoft.com/en-us/library/ms142560(SQL.90).aspx
Nous avons autant de memory et de cpu que nous pouvons nous permettre, malheureusement nous ne pouvons pas mettre les catalogues sur leurs propres controllers de disque.
Je suis perplexe et prêt à explorer d'autres alternatives aux requêtes FullText. Y at-il quelque chose d'autre qui donne ce genre de "Writer" / "Writing" matchs similaires? Peut-être même quelque chose qui utilise le CLR?
Jetez un oeil à ces alternatives, bien que je doute qu'ils améliorent les performances sans les isoler sur un matériel séparé:
Quelle technologie de search utiliser avec ASP.NET?
Lucene.Net et SQL Server
En raison de la nature de FREETEXT, la performance est inférieure à celle de CONTAINS, simplement parce qu'elle doit prendre en count des alternatives less précises pour les mots keys donnés. CONTAINS peut find Writing lorsque vous spécifiez Write btw, je ne suis pas sûr si vous avez vérifié si CONTAINS fera l'affaire ou non.
Assurez-vous également d'éviter les instructions IF dans SQL, car elles conduisent souvent à une recompilation complète du plan d'exécution pour chaque exécution de requête, ce qui consortingbuera probablement aux performances médiocres que vous voyez. Je ne suis pas sûr comment la déclaration IF est utilisée, car il est probable que dans un plus gros morceau de SQL. Essayez de merge la requête EXISTS avec cette plus grande partie de sql, car vous pouvez définir le paramètre @match à partir de l'instruction SELECT dans EXISTS, ou vous débarrasser complètement de la variable et utiliser la clause EXISTS comme prédicat dans la requête plus grande.
SQL est un langage orienté set et interprété. Par conséquent, il est souvent plus rapide de se débarrasser des constructions de programmation impératives et d'utiliser à la place les opérateurs set-natifs de sql.
peut-être que https://github.com/MahyTim/LuceneNetSqlDirectory peut vous aider, il permet de stocker un index LuceneNET dans SQLServer.