J'ai besoin de chercher et d'afficher des données sur une page Web dont le nombre d'enregistrements peut varier en fonction des filtres d'environ 500 enregistrements à 1 million d'enregistrements. P>
La mise en cache de n'importe quelle utilisation ici car je pense que millions d'enregistrements en mémoire n'est pas une bonne pensée. La pagination est un must à mettre en œuvre bien sûr. Affichage d'un million d'enregistrements est un pire des cas (le stupide devrais-je utiliser une architecture connectée (SQLDatreader) ou une architecture déconnectée (jeux de données)? P> sqldatreader code>? p>
tout filtre code> dans les cas d'utilisation!). P>
4 Réponses :
Tout d'abord, pensez-y comme ceci comme suit: affichant 1 million d'enregistrements ne sont absolument aucun sens pour aucun utilisateur. Donc, vous devez penser à ce que l'utilisateur attend de voir. Peut-être un résumé ?! Peut-être paginez les enregistrements dans les pages de 25, ou 50 ou 100 enregistrements. L'une de ces approches ne vous obligera pas à contenir 1 m enregistrement à la fois en mémoire. P>
En outre, lorsque vous exécutez une requête sur une base de données SQL et utilisez une SQLDatreader, vous ne recevrez pas tous les enregistrements, mais le pilote SQL enverra la requête sur le serveur SQL, le serveur exécutera la requête, préparez un résultat. Définissez et créez un curseur avant uniquement sur le serveur. Ensuite, le pilote va chercher un enregistrement à la fois, chaque fois que vous appelez Lecture () sur votre Sqldatreader. Le comportement est très similaire si vous utilisez LINQ vers SQL, qui utilise une exécution différée. L'ensemble de résultats n'est pas transféré en totalité jusqu'à ce que (ou à moins que) vous demande spécifiquement chaque ligne. P>
Donc, une simple requête de pagination fera le tour. Ou dans d'autres cas, une sorte de rapport de synthèse qui regroupe les données de ces 1 million d'enregistrements une ou deux pages de données pertinentes. P>
Bien sûr, si vous avez besoin de vous déplacer dans les pages, une sorte de mise en cache peut avoir un sens, mais à nouveau, pensez-y: à quelle fréquence un utilisateur voudra-t-il réellement parcourir 1 million d'enregistrements - probablement jamais. < / p>
En tant que dernière note, si vous mettez en œuvre la pagination - assurez-vous que la méthode que vous utilisez pour implémenter la pagination s'appuie sur l'envoi de données SQL Server une page à la fois et ne lisez pas tous les 1 million d'enregistrements dans ASP.NET, puis Paginant la copie locale des données car cela serait très inefficace et lent. Voici un exemple d'une requête SQL Server qui effectue une pagination: Donc, question # 109232 p>
Belle explication détaillée. Merci! Mais toujours une question: les ensembles de données ne seront-ils pas d'aide ici?
Un jeu de données fonctionne différemment. Contrairement au Sqldatareader qui a un comportement avant seulement, un jeu de données doit apporter toutes les données du serveur localement avant de les opérer. Cela facilite l'utilisation dans certains cas, mais si vous êtes requis, cela pourrait renvoyer 1 million de datégors d'enregistrements ne sont pas la solution. En fin de compte, tout dépend de la requête.
Si votre serveur ne peut pas mettre en cache 1 million d'enregistrements comment pensez-vous que le navigateur Web de votre utilisateur va gérer un million d'enregistrements de HTML à votre arrivée? P>
Considérez la pagination ( Voici un exemple avec 1 million d'enregistrements ) P>
considère également que l'utilisateur ne veut jamais plus d'environ 30 à 50 enregistrements. Vous vous montrez soit un niveau de détail trop bas, ou vous avez besoin de plus de filtrage. P>
Ce lien était cool. Sorte de ce que je veux. Mais qu'est-ce qu'il utilise dans l'arrière-plan..Datasets? Je vois que la récupération est assez rapide.
@Manish, le fond est agnostique à cette grille. En utilisant n'importe quelle langue, vous pouvez vous connecter à n'importe quelle base de données. Ensuite, l'astuce consiste à écrire des requêtes SQL qui utilisent correctement les index de manière à ce que les lignes de retour N-M sont rapides.
Je suis d'accord avec le reste des intervenants. Affichage des enregistrements de 1 m est ridicule. Toutefois, vous pouvez afficher les premiers enregistrements X et la page via.
Le truc est dans la procédure stockée faisant la récupération p>
En réalité, le dB est MS-SQL Server 2008.
Je vais suggérer utiliser une requête dynamique avec la pagination. Donc, lorsque vous cliquez sur sur des enregistrements spécifiques de la page de page uniquement pour ces pages. Pour récupérer l'enregistrement de la base de données à partir d'une plage spécifique, utilisez la requête suivante.
Comme ça. P>
Create proc Test
@take smallint,
@skip smallint,
@orderBy nvarchar(20),
@subscriptionid smallint,
as
DECLARE @SQLQuery AS NVARCHAR(max)
SET @SQLQuery=' Select ROW_NUMBER() OVER (ORDER BY P.ProductId desc) as RowNum,* from product"
set @SQLQuery=@SQLQuery + ' and Subscriptionid='+CONVERT(nvarchar, @subscriptionid)
set @SQLQuery= ';WITH Results_CTE AS ( '+@SQLQuery
set @SQLQuery= @SQLQuery +' ) SELECT * FROM Results_CTE WHERE RowNum > '+CONVERT(nvarchar, @skip)+' AND RowNum <= '+CONVERT(nvarchar, @skip+@take) --//paging';
END
EXECUTE sp_executesql @SQLQuery
J'essaie simplement de travailler s'il y a suffisamment d'heures en une journée à la page à la page d'un million de rangées de données. Disons 40 rangées par page de 25 000 pages requises, disons 1 min de navigation par page serait de 25 000 minutes ou environ 17 jours - Eeeek
Il ne fait aucun sens d'afficher un million d'enregistrements si vous me demandez. Quel est le scénario ici?
En dehors, en supposant que vos dossiers ont une moyenne de 150 octets (c'est comme un nom, une brève description, un couple d'InTS et un couple bools). 1 million d'enregistrements seraient inférieurs à 150 Mo. Pas vraiment trop pour stocker dans le cache. Cependant, il convient de noter que votre serveur de base de données (probablement SQL Server) fait déjà la mise en cache. En fait, si des questions comme celle-là sont courantes et que vous avez beaucoup de mémoire, je penserais qu'il est possible que toute la table soit en mémoire.
@ F00: Un million d'enregistrements est un scénario pire des cas, édité la question en conséquence.
Utilisez définitivement SQLDatreader si vous devez faire face à des millions d'enregistrements. Les jeux de données deviendront probablement très inefficaces à cause de l'architecture. Voir ma réponse ci-dessous.
Après édition ... Débarrassez-vous du filtre "Tous". Activez le filtrage plus avancé de sorte qu'un utilisateur puisse expliquer exactement ce qu'ils veulent.
Personnellement, j'utiliserais des fichiers de données déconnectés (pas des ensembles) ou lancez mes propres objets commerciaux sérialisés peuplés par un digne d'administrateur car ils sont beaucoup plus évolutifs sous charge concurrent que des digne d'administration - msdn.microsoft.com/en-us/library/ms978388.aspx