.NET vs SQL Server – meilleure pratique pour la search répétée

Mon client request une search basée sur une "suggestion" à append à un champ de formulaire particulier. En d'autres termes, lorsque vous commencez à taper dans un champ, il devrait y avoir un popup "Google style" qui suggère des résultats possibles à sélectionner. Il y aura de l'ordre de «dizaines de milliers» de suggestions possibles – c'est la meilleure estimation que j'ai actuellement sur la quantité.

En utilisant AJAX pour envoyer / récupérer le résultat, ma question est de savoir s'il vaut mieux stocker TOUTES les suggestions dans le cache .NET et y traiter, ou s'il vaut mieux exécuter une requête basée sur une procédure stockée sur SQL Server pour chaque requête?

Cela utiliserait .NET 2.0 et SQL Server 2005

Votre col de bouteille transportera datatables du server vers le browser. Vous pouvez facilement produire un résultat important à partir de la database en un rien de time, mais cela prend une éternité pour revenir au browser.

Vous devrez find un moyen de limiter le résultat renvoyé par le server, de sorte que vous ne récupériez que ce que l'user doit voir maintenant.

Lorsque le trafic de données atteint un niveau raisonnable, vous pouvez commencer à optimiser la partie server. Avec une certaine caching et une logique qui devrait être facile, étant donné que l'user tape le résultat est souvent un sous-set du résultat précédent, par exemple la correspondance pour "hat" est un sous-set de la correspondance pour "ha".

Il y a un truc que j'utilise chaque fois que je fais face à une telle tâche. Ne le faites pas à chaque frappe. Mettez le lancement de la search sur un timeout d'attente glissant.

L'intention ici est de lancer la search uniquement lorsque l'user a fait une pause dans sa frappe. Habituellement, je définis le timeout d'attente de 0,1 à 0,2 seconde. Psychologiquement, il est encore instantané, mais il réduit considérablement la charge sur tout ce que vous utiliserez pour chercher

Lorsque j'ai vu les searchs de type "suggérer en cours de frappe" effectuées dans des environnements SQL Server, j'ai observé les meilleures performances en utilisant un mécanisme de caching et, en général, une approche dissortingbuée, comme un memcached. Même si votre code est bien optimisé, votre database est bien ajustée et votre requête ne prend qu'un <= 10ms avec l'appel, le traitement et le return, c'est-à-dire 10ms au fur et à mesure de la frappe.

Cela dépend du nombre d'objects. Si vous pouvez mettre en cache les éléments dans un process .NET sans manquer de memory, cela sera certainement plus rapide.

Mais si cela ne peut pas être fait, vous êtes bloqué avec l'access à la database à chaque request. Une procédure stockée serait une bonne façon de le faire.

Mais il existe des templates de design qui peuvent vous guider. J'ai utilisé les deux suivants en développant quelque chose de similaire à ce que vous faites.

  • Soumission de la soumission
  • Cache du browser