2009-09-28 5 views
3

Stack Overflowers:L'alternative la plus rapide à Datatable.Select() pour restreindre les données en cache?

J'ai une fonction de recherche sur le site Web de mon entreprise (basée sur .NET 2.0) qui vous permet d'affiner le catalogue de produits en utilisant jusqu'à 9 champs différents. À l'heure actuelle, après avoir effectué vos sélections sur le frontend, je construis une requête dynamique et je tape sur la base de données (SQL Server) pour obtenir la liste des numéros d'éléments qui en résulte. Je voudrais éviter de frapper la base de données à chaque fois et faire tout cela en mémoire pour des résultats plus rapides. Fondamentalement, une "table" de 3500 à 4500 lignes avec 10 colonnes: le numéro d'article (qui pourrait être une clé primaire) et les 9 champs d'attributs (qui ont des valeurs répétées pour beaucoup de lignes). Il peut y avoir un certain nombre de différentes recherches entre les 9 colonnes pour obtenir les éléments souhaités:

  • colonne A = « foo » et la colonne D « bar » =
  • Colonne B = « foo » et la colonne C = 'bar' et la colonne I = 'me'
  • Colonne H = 'foo'
  • etc ...

d'après mes recherches, la fonction .Choisir() semble être la façon la plus lente à effectuer la recherche, mais il me semble être le moyen le plus rapide et le plus facile à effectuer la le rétrécissement des recherches pour obtenir la liste des numéros d'article:

MyDataSet.Select("Column B = 'foo' AND Column E = 'bar' AND Column I = 'me'") 

Dans mon cas particulier, quelle méthode proposez-vous que je l'utilise comme une alternative qui a la même fonctionnalité de rétrécissement et de meilleures performances au lieu de se contenter de la datatable.select () méthode?

Répondre

2

Les données ne sont pas construites de façon optimale pour être interrogées, je ne recommanderais pas d'aller dans cette voie, sauf si vous avez vraiment un problème de performance documenté que vous êtes certain d'être amélioré en le faisant.

Si vos requêtes dynamiques sont lentes, c'est probablement parce que vous n'avez pas correctement indexé votre table dans votre base de données. Les bases de données sont conçues pour pouvoir interroger de façon optimale vos données, donc mon intuition serait qu'un peu de travail sur la base de données devrait vous mener là où vous devez aller.

Si vous avez vraiment besoin d'interroger des données ADO.Net, veillez à lire attentivement Scaling ADO.Net DataTables. Il parle de choses que vous pouvez faire pour en accélérer la performance, et vous donne des repères pour que vous puissiez voir la différence.

+0

Désolé, j'aurais dû préciser que les requêtes dynamiques que j'exécute actuellement sont assez rapides car tout est indexé correctement, je veux juste que l'application fonctionne encore plus vite en ne passant pas du tout si je n'ai pas à . – NinjaBomb

+0

@NinjaBomb: vous allez toujours passer par-dessus le fil (entre le client et le serveur) avec cette approche. Tout ce que vous évitez est le voyage entre le serveur et la base de données (ce qui ne devrait pas être un goulot d'étranglement pour vous de toute façon), et c'est au prix d'une grande partie de la mémoire du serveur. – MusiGenesis

+0

Que pensent les experts de la mise en cache des ensembles de résultats que je reçois de la base de données au cas où quelqu'un exécuterait exactement la même recherche dans un délai donné? – NinjaBomb

3

Votre meilleure alternative est de laisser votre base de données faire ce qu'elle préfère: interroger et filtrer des données.

La mise en cache de DataTables (en particulier ceux avec des lignes 3500-4500) est une mauvaise idée pour les applications Web. Appeler Select() sur un DataTable ne réduit pas le nombre de lignes dans le DataTable - il renvoie une nouvelle collection de lignes (copiées à partir de l'original), ce qui signifie que les 4 000 lignes originales resteront dans le cache. Mieux vaut ne rien avoir du tout dans le cache, et juste obtenir les lignes dont vous avez besoin lorsque l'utilisateur les demande.

DataTables (et DataSets) sont mieux utilisés avec les gros clients (généralement les applications Windows) qui doivent travailler avec des copies en mémoire de données de base de données dans un état déconnecté.

Questions connexes