2012-03-13 17 views
8

Quando si utilizza la clausola SQL Server TOP in una query, il motore di SQL Server interrompe la ricerca di righe una volta che è sufficiente per soddisfare il TOP X da restituire?SQL Server TOP interrompe l'elaborazione dopo aver trovato un numero sufficiente di righe?

Si consideri la seguente query (assumere some_text_field è unico e non è impostato per l'indicizzazione full-text):

SELECT 
    pk_id 
FROM 
    some_table 
WHERE 
    some_text_field = 'some_value'; 

e

SELECT TOP 1 
    pk_id 
FROM 
    some_table 
WHERE 
    some_text_field = 'some_value'; 

La prima query avrebbe bisogno di cercare l'intera tabella e ritorno tutti i risultati trovati Tuttavia, nel modo in cui lo abbiamo configurato, quella query restituirebbe davvero un valore. Quindi, utilizzare TOP 1 impedisce al server SQL di analizzare il resto della tabella una volta trovata una corrispondenza?

+1

Sì, si ferma dopo la prima partita. – MicSim

+6

Se si utilizza 'TOP x' ** senza ** fornendo un' ORDER BY', i risultati saranno casuali e non prevedibili. In quanto tale: poiché dovresti fornire un 'ORDER BY' perché la query abbia un senso, devi avere un indice appropriato per consentire al processore di query di recuperare le prime n righe in ordine e fermarsi dopo di ciò - altrimenti l'intera tabella deve essere scansionata e ordinata. –

+0

@marc_s Il tuo commento è la migliore risposta. :) –

risposta

6

Sì, la query si interrompe una volta che ha trovato abbastanza righe e non interroga il resto delle tabelle.

Si noti tuttavia che probabilmente si desidera avere un indice che il database può utilizzare per la query. In quel caso non c'è davvero alcuna differenza di prestazioni tra ottenere la prima partita e ottenere tutte le partite.

+0

La risposta di Martin Smith è buona, ma questa è un po 'più pertinente alle mie esigenze. sto lavorando su software vecchi/legacy, e nessuno è passato e ha fatto pochissimi indici, quindi stiamo facendo cose del genere che finiscono per eseguire scansioni di tabelle complete solo per trovare una riga di dati validi ... – jzimmerman2011

5

Sì.

In questo caso si otterrebbe 1 fila indefinita (come TOP senza ORDER BY non garantisce alcun risultato particolare) allora sarebbe interrompere l'elaborazione (Il TOP iteratore nel piano non richiedere alcun più righe da iteratori bambino).

Se v'è un operatore di blocco (come SORT) nel piano prima che l'operatore TOP o operatori parallele prima della TOP può finire per fare un sacco di lavoro per le righe non restituiti nel risultato finale in ogni caso però.

Problemi correlati