Quel est le plus rapide: filterr un DataSet en memory ou renvoyer un jeu de résultats à partir de SQL Server?

Je travaille sur une assez grande table (800k records et escalade) et j'aimerais filterr cette table. La chose est, la table est stockée dans SQL Server. Donc, je me demandais, serait un

SELECT * FROM table WHERE condition1=true 

requête être plus rapide que de charger la table à un DataSet typé et en utilisant DataRow.Find (), puis en envoyant tous ces à un autre DataTable?

Je devine oui, mais je vais requestr quand même.

Tant que votre server SQL ne pagine pas à cause de la famine de la memory vive, le server SQL doit toujours être plus rapide que le chargement de la table entière via le réseau, puis le filtrage local …

Vous devriez certainement le faire dans SQL Server parce que:

  1. C'est l'une des choses qu'un server de database est conçu pour faire et est bon. Si la condition implique toujours les mêmes colonnes, vous pouvez envisager d'append des index pour accélérer la search encore plus.
  2. En termes de performances, il est toujours plus rapide de charger less de données
  3. Votre consommation de memory va exploser lorsque vous essayez de charger le tout dans la memory. Surtout quand la table ne se développe pas. Cela pourrait bien fonctionner maintenant mais peut vous tuer plus tard de façon inattendue.

La seule exception est si vous allez exécuter cette requête encore et encore. Dans ce cas, il peut être judicieux de mettre en cache datatables localement, puis de les filterr … mais même dans ce cas, vous ne devriez le faire que si les tests de performances indiquent des économies significatives.

Je ne pense pas qu'il y ait vraiment une réponse à toutes les questions, vous devriez la tester et mesurer la performance pour votre situation particulière.

Lorsque vous effectuez plusieurs requêtes compliquées, avec des jointures entre plusieurs tables, etc., nous avons constaté qu'il peut être beaucoup plus rapide d'exécuter une requête volumineuse dans un set de données, puis de filterr la façon dont nous avons besoin de memory. Une grande partie de l'augmentation de performance pour nous est parce qu'elle nous évite de faire plusieurs appels à la database, ce qui peut provoquer un goulot d'étranglement.

Il y a des fonctions SQL, par exemple si vous devez faire quelque chose comme WHERE LocationId IN (1, 2, 3, 4, 5, 6) qui fonctionne de façon pire en SQL par rapport à dataset.LocationIds.Where(id => myValues.Contains(id)) en C #, par rapport à de grands sets de données , donc dans cette situation, si vous l'avez mesuré, vous devriez find les meilleurs résultats en memory.

Un SELECT avec des conditions WHERE simples serait presque certainement plus rapide dans SQL cependant. C'est pourquoi vous devriez évaluer chaque scénario et tester et mesurer si nécessaire.

Si votre filter peut être écrit comme une procédure stockée (vous pouvez utiliser des parameters pour les valeurs dans la sélection), il sera certainement plus rapide car la première fois que vous appelez la procédure stockée, son plan d'exécution est calculé et stocké. Au prochain appel, n'attendez pas que le plan soit calculé. (dans votre exemple, le time de calcul du plan est probablement minuscule).

Je comprends que cette question est ancienne, mais les réponses manquent toutes un point important. Une database peut utiliser les critères de filter, ainsi que les index de table, pour charger less de données à partir du disque . Par exemple, si vous deviez SELECT * FROM X WHERE ID = 7 alors (en supposant que l' ID soit une key primaire ici), la database ne chargera qu'une seule ligne à partir du disque. Si vous avez filtré ces données du côté server, la database devra charger la totalité de la table du disque.

En supposant que vous êtes lié aux E / S, cela vous donnera des performances nettement meilleures. Bien sûr, tous les critères de filtrage ne peuvent pas fonctionner de cette manière. Cela dépend du server de database, des index, etc.