2013-11-14 7 views
6

Ho la seguente interrogazioneOttimizzare query in modo che non ha bisogno di un Top N sorta

select top 25 
    tblSystem.systemName, 
    tblCompany.name 
from 
    tblSystem 
    join tblCompany 
     on tblSystem.fkCompanyID = tblCompany.pkCompanyID 
order by 
    tblSystem.systemName, 
    tblCompany.name 

che genera il primo piano di esecuzione nella foto, il secondo è la stessa query senza il order by

enter image description here
C'è un modo per liberarsi di TOP N Sort (quindi è necessario solo un TOP) indicizzando le tabelle in un modo particolare?

+1

Non capisco la domanda. Perché vuoi rimuovere il 'TOP 25' quando ne hai bisogno? –

+0

@TimSchmelter Se rimuovo 'order by' a' TOP' senza sort è fatto. Voglio sapere se posso indicizzare le tabelle in modo che l'ordinamento non sia necessario. – Magnus

+0

Una [vista indicizzata] (http://stackoverflow.com/questions/19982562/optimize-query-so-it-does-not-need-a-top-n-sort) potrebbe funzionare, ma gli indici su tabelle separate essendo JOINed non allevierà la necessità di ordinare in questo caso. – HABO

risposta

4

Aggiungere un indice a tblSystem su systemName con fkCompanyID incluso.

create index IX_tblSystem_systemName 
    on tblSystem(systemName) include(fkCompanyID) 

riscrivere la query per selezionare i primi 25 valori (con legami) da tblSystem in una tabella derivata ordinato da systemName e poi unirsi a tblCompany per ottenere i valori di 25 necessari.

A seconda che fkCompanyID consenta o meno valori nulli, è necessario filtrare i valori nulli nella clausola where nella tabella derivata.

select top (25) 
    S.systemName, 
    C.name 
from (
    select top (25) with ties 
     S.fkCompanyID, 
     S.systemName 
    from tblSystem as S 
    where S.fkCompanyID is not null 
    order by S.systemName 
    ) as S 
    inner join tblCompany as C 
    on S.fkCompanyID = C.pkCompanyID 
order by S.systemName, 
     C.name 

Si dovrà ancora in alto (n) Operatore sorta ma sarà ordinare solo le 25 righe (+ legami) che avete ottenuto dalla tabella derivata è unito contro tblCompany.

enter image description here

0

Si può essere in grado di sbarazzarsi di esso avendo un indice di copertura contenente le righe già ordinate da ASC di nome del sistema, nome ASC, ma il mio sospetto è che si sta microterminando. Questa query è lenta? Se è veloce, il fatto che il "top N sort" richieda "metà del tempo" non è molto importante. Se è lento, sarei molto più interessato alla scansione dell'indice anche se è elencato come 4%.

Problemi correlati