Lentezza caricamento dati

venerdì 02 settembre 2011 - 16.25
Tag Elenco Tags  C#  |  .NET 3.5  |  Windows Server 2003  |  Visual Studio 2008  |  SQL Server 2005

elsinore Profilo | Junior Member

Ciao a tutti,

ho un problema abbastanza comune ma vorrei qualche delucidazione :)

Io ho la mia bella pagina...con un datagrid che viene popolato da una bella query su un db ......
la query di ricerca comprende una select su un decina di campi.....tra cui un paio di funzioni.... e una where condition...con un paio di condizioni...senza like...

quindi.....
select c1,c2,c3,c4,c5, f1,f2 from t1 where a =x e b <> y

...succede che quando la ricerca mi ritorna un certo numero di righe (circa 1000).....il tutto si rallenta.....(circa un paio di minuti di attesa)

Gli indici sulle tabelle ci sono,li ho verificati anche con lo strumento di SQL Server..... nella mia ignoranza pensavo che usando il pagesize del datagrid.....mi spezzettasse il carico dei dati...ma non è casì....giustamente carica tutto e poi lo riorganizza.....

contando che sicuramente la query può essere più performante......ma non c'è uno strumento dipo datagrid...ma che mi suddivide il carico dei dati oltre a impaginarli solamente??....una cosa del tipo...pagesize=60....e lui mi carica 60 dati alla volta... chiedo venia se ho detto troppe fesserie! :-)


Gluck74 Profilo | Guru

nessuna fesseria, il problema è comune a tanti.

Per quanto ne so io, non hai molte possibilità di migliorare la situazione utilizzando i contolli asp.net classici.
Puoi invece usare la paginazione lato server modificando la query ed aggiungendo uno o più parametri per farti ritornare solo le righe che ti interessano (esempio start e num)

Quello che puoi sfruttare è l'ObjectDataSource che ti da una mano a passare questi parametri alla tua query (o StoredProcedure).
Qui un buon esempio:
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.maximumrowsparametername.aspx


Un'altra cosa che puoi fare è utilizzare Linq. Questa libreria ti permette di creare query non SQL ma sugli oggetti Entity che vengono create. Ci penserà lui a trasformare le interrogazioni in query SQL ottimizzate. Esempio:
from p in Products orderby p.ProductName select p
è una interrogazione Linq che viene trasformata in una normalissima query select from.
ma guarda l'esempio successivo:
(from p in Products orderby p.ProductName select p).Skip(20).Take(20) __________________________ -- Region Parameters DECLARE @p0 Int = 20 DECLARE @p1 Int = 20 -- EndRegion SELECT [t1].[ProductID], [t1].[ProductName], [t1].[SupplierID], [t1].[CategoryID], [t1].[QuantityPerUnit], [t1].[UnitPrice], [t1].[UnitsInStock], [t1].[UnitsOnOrder], [t1].[ReorderLevel], [t1].[Discontinued] FROM ( SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ProductName]) AS [ROW_NUMBER], [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued] FROM [Products] AS [t0] ) AS [t1] WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1 ORDER BY [t1].[ROW_NUMBER]


anche se non ti va di usare Linq, puoi prendere supunto su come fare la paginazione lato server DB.

Ciao e buon lavoro

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

elsinore Profilo | Junior Member

si conosco linq.....e anche io immaginavo di dover spostare la logica lato DB...... ok grazie!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5