J'ai une méthode qui lit les données en utilisant SqlDataReader et le rendement retourne un IEnumerable, .: par exemplePrendre (10) vs TOP 10 Avec SqlDataReader?
IEnumerable<string> LoadCustomers()
{
using(SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
yield return rdr.GetString(0);
}
}
}
Maintenant, supposons que j'ai besoin que 10 nouveaux clients. Je pouvais faire
LoadCustomers.Take(10)
ou passer 10 en tant que paramètre à sql et faire mon sql
SELECT TOP 10 FROM Customers ORDER BY CreationDate DESC
Selon this post l'ensemble des résultats sont transmis depuis le serveur sql au client même si le datareader lit seulement quelques lignes (tant que la connexion est ouverte) - devrais-je éviter l'approche Take(10)
parce que ces données supplémentaires sont transmises de toute façon au client ou il serait une optimisation prématurée pour l'éviter (parce que le code retour de rendement ferment la connexion après il a lu 10 lignes et alors la transmission de données s'arrêterait de toute façon)?
'COMMANDER PAR CreationDate DESC'? – jarlh
Ce ne serait pas une optimisation prématurée. Ne prenez dans la base de données que ce dont vous avez réellement besoin. Cela n'a aucun sens de sélectionner 10 000 clients alors que vous n'en avez besoin que de 10. –
Vous interprétez mal ce que ce post dit. Le jeu de résultats entier n'est * pas * transmis au client si vous arrêtez de lire, bien que certaines lignes puissent déjà être mises en mémoire tampon. 'SqlDataReader' ne" lit pas "au-delà du réseau. La raison pour laquelle vous voulez toujours envoyer 'TOP (10)' au serveur de base de données dans la plupart des cas, et pourquoi ce n'est pas une optimisation prématurée, c'est parce que l'optimiseur peut produire un plan plus efficace s'il sait que vous voulez seulement 10 lignes. lire toute la table (si rien d'autre, la requête allouera moins de mémoire à l'avance). –