Problema GridView + ObjectDataSource: prestazioni ugualmente negative per set di risultati grandi e piccoli

StackOverflow https://stackoverflow.com/questions/818091

Domanda

Di recente sono stato chiamato a lavorare su un'app Web legacy .NET precedente. Le prestazioni erano recentemente diminuite al di sotto della media, poiché la quantità di dati nel sistema era quadruplicata. Andava bene per i 2 anni precedenti.

Stava usando un file .xsd per parlare con una procedura memorizzata che restringeva sufficientemente i risultati (anche se senza paginazione) e li inseriva in un GridView tramite un ObjectDataSource.

La parte su cui non riesco a capire è che ci sono voluti circa 7 secondi per caricare 1 risultato, 140 o 1200. Ci voleva una divisione secondo per 0 casi di risultati. (GridView gestisce l'impaginazione)

Usando il profiler SQL, siamo riusciti a vedere che la query impiegava 6,9 secondi. L'esecuzione della stessa query con gli stessi parametri ha richiesto 100 ms in SQL Management Studio. Ho modificato i parametri per assicurarmi che non fosse solo un risultato memorizzato nella cache. Il lungo tempo di attesa è riproducibile in modo affidabile.

Sono consapevole che implementazione del paging dovrebbe essere fatto qui, ma per ora sto solo cercando retrospettivamente di trovare una spiegazione dietro il motivo per cui la pagina sta eseguendo altrettanto male per piccoli e grandi set ...

(Il display "semplice" di GridView va bene per le loro esigenze - non è necessario controllare l'HTML)

È stato utile?

Soluzione

Abbiamo lo stesso problema:

  1. Controlla se le tue statistiche sono aggiornate:
    SELECT 
        ObjectName = Object_Name(ind.object_id),
        IndexName = ind.name,
        StatisticsDate = STATS_DATE(ind.object_id, ind.index_id)
    FROM SYS.INDEXES ind
    order by STATS_DATE(ind.object_id, ind.index_id) desc
  1. Rilascia la cache del server SQL:
    DBCC DROPCLEANBUFFERS
    DBCC FREEPROCCACHE
  1. Se nessuno dei due aiuta, puoi provare a imporre il piano di query SSMS con suggerimenti come " inner LOOP join " e " con (indice = ...) " ;.

Altri suggerimenti

Potresti provare a guardare il piano di esecuzione e il tipo di parametri inviati dalla tua applicazione. Ad esempio, se l'applicazione sta passando un nvarchar per il confronto con una colonna varchar potrebbe causare problemi. http://weblogs.sqlteam.com/tarad/archive/ 2007/11 / 16 / 60408.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top