2011-08-30 7 views
3

J'utilise ASP.Net Dynnamic Data (.Net Framework version 4.0) et SQL Server 2008 pour afficher les données d'un ensemble de tables. Dans la base de données, il y a une certaine table maître contenant 83 colonnes avec 854581 lignes de données dont la croissance est toujours attendue. J'ai fait peu de modifications aux modèles par défaut, et la plupart des opérations sont assez rapides pour un site Web d'entreprise, y compris le filtrage, l'affichage de clé étrangère, etc. Pourtant, le pager s'est avéré être un problème de performance majeur. Avant d'effectuer une optimisation à l'aide de l'assistant d'optimisation de la base de données, la page de liste des tables principales ne s'affiche même pas lorsqu'une requête de comptage simple expire. Après toutes les optimisations, les premières centaines de pages s'afficheront sans problème, mais tout ce qui dépasse 1000 pages est insupportablement lent et la dernière page expire.Comment améliorer la performance de pagination des données dynamiques ASP.Net

Notez que j'ai optimisé la requête pour la dernière page à l'aide de Database Tuning Advisor, ce qui ne me donnait aucun conseil.

J'ai essayé d'exécuter une requête très simple en utilisant row_number() pour voir la dernière page, similaire à la requête suivante:

SELECT TOP 10* FROM 
    (SELECT *, row_number() OVER (ORDER BY [Primary Key Column] ASC) AS [rn] 
    FROM [Master Table]) AS TB1 
WHERE TB1.rn > 854580 

La requête ci-dessus a pris environ 20 secondes pour terminer la première fois qu'il a été exécuté, alors que le service SQL Server sqlservr.exe a consommé jusqu'à 1700 KiB de mémoire (j'utilise des fenêtres 32 bits sans commutateurs de noyau spéciaux, par conséquent, chaque processus a au plus 2 Gio d'espace d'adressage). Donc, ma question est, y at-il un moyen plus efficace que d'utiliser row_number() pour faire la pagination dans les données dynamiques ASP.Net et comment l'implémenter.

Il y a deux possibilités que je suis venu avec:

  1. Il y a un langage T-SQL magique construire avec de meilleures performances, par exemple, quelque chose comme LIMIT <From row number>, <To row number> dans MySQL.
  2. ajouter une colonne de numéro de séquence dans le tableau, et la page en fonction de ce numéro quand il n'y a pas de filtrage ou de tri

Peut-être le plus grand problème est de savoir comment mettre en œuvre cette pagination personnalisée dans les données ASP.Net dynamique. Toute aide est appréciée, même les échantillons de pagination ne sont pas destinés à améliorer les performances, juste pour me donner une idée.

Note: Je ne peux pas changer le moteur de base de données que j'utilise, alors ne recommandez pas MySQL ou PostgreSQL ou quelque chose comme ça.

+0

Ne vous inquiétez pas, nous allons toujours essayer de trouver la solution qui fonctionne pour ** vous **, dans votre situation. " X sucks, utilisez Y à la place! "N'est jamais une bonne réponse ici –

+0

Merci Cette dernière note était une mauvaise habitude portée à partir d'un ancien forum, peut-être pas ici. – Interarticle

Répondre

0

20 secondes sont longues même pour 1 million de lignes - vérifiez vos index SQL Server!

Vérifiez également que vous récupérez uniquement les colonnes de données requises dans la vue Liste. (vous avez mentionné 83 colonnes .... vous ne montrez pas toutes celles-ci dans la vue liste

Une autre approche que je peux penser est d'utiliser les expressions de requête Linq avec Skip() et Take() pour obtenir une page à Bien sûr, cela signifie que vous demanderez moins de données, plus souvent

+0

pagination des données avec la colonne de clé primaire est très rapide. Pourtant, row_number() généré par linq 'Skip()' et 'Take()' est très lent. Je vais essayer de réduire le nombre de colonnes sélectionnées pendant le test, mais je peux vous assurer que la plus grande partie de la colonne doit apparaître dans la liste (sauf s'il y a un moyen de les afficher dans la vue Détails mais pas dans la vue Liste , que je n'ai pas encore trouvé), plus un certain nombre de relations clés étrangères. – Interarticle

+0

Voici une méthode de masquage de colonnes dans certains modèles de pages: http://csharpbits.notaclue.net/2008/10/dynamic-data-hiding-columns-in-selected.html –

Questions connexes