Innanzitutto, perché DBCC DROPCLEANBUFFERS;
? Questo è un reset a freddo del pool di buffer. A meno che non si voglia misurare e ottimizzare le prestazioni dell'IO dei dischi rigidi, a nessuno importa delle prestazioni di una cache fredda. Questo è non come funzionerà il tuo sistema. La memorizzazione nella cache delle pagine nel pool buffer è l'aspetto della prestazione più critico nei database e lo si elimina. È come presentarsi in una Ferrari senza motore e chiedere perché è così lento. Per le misurazioni delle prestazioni dovresti fare esattamente il di fronte allo: esegui la query 4-5 volte per scaldare la cache, quindi misurare.
In secondo luogo, qual è la struttura del tavolo? La tabella è Account.Customer
ordinata per cluster di tabelle per Record_id
? Se no, non otterrai mai le prestazioni che desideri, indipendentemente da come esprimi il tuo T-SQL.
E, ultimo ma non meno importante, quale sistema avete? Ha abbastanza RAM per memorizzare in cache l'intero database in memoria? Se no, acquista più RAM. Esistono altri processi che competono per la memoria, come IIS/Asp? Se sì, buttali sul loro server, dovresti n ever ever run the database on the same host as the web server se le prestazioni sono importanti.
Per una paginazione veloce alternativa considerare soluzioni ideate keyset:
/* moving up */
SELECT top(@Page_Size) *
FROM Account.Customer
WHERE Record_Id > @lastPageRecordId
ORDER BY Record_Id;
/* moving down */
SELECT top(@Page_Size) *
FROM Account.Customer
WHERE Record_Id < @firstPageRecordId
ORDER BY Record_Id DESC;
Un mazzo di chiavi guidato soluzione può chiedere direttamente alla ultima posizione e poi spaziare scansiona la pagina successiva/precedente, utilizzando la posizione chiave di indice cluster. La logica di paging (stato) deve ricordare l'ultimo e il primo tasto sulla pagina visualizzata per continuare da lì, invece di ricordare il numero di pagina.
Le soluzioni basate su Rowcount (così come LIMIT in MySQL) sono meno efficienti di quelle basate su keyset perché devono sempre contare i record per posizionarsi, invece di cercare direttamente la posizione come possono farlo i keysets.
fonte
2010-02-06 20:25:35
cosa dice il piano di esecuzione? – super9
Quali indici hai? Puoi pubblicare lo script della tabella di creazione? –
Correlati: http://stackoverflow.com/questions/1897436/row-number-over-not-fast-enough-with-large-result-set-any-good-solution –