2016-05-24 17 views
20

mi sono imbattuto in questa domanda:Will "Dove 0 = 1" analizzare tabella completa o solo tornare nomi delle colonne

SQL Server: Select Top 0?

voglio chiedere se uso la query

SELECT * FROM table WHERE 0=1 

o

SELECT TOP 0 * FROM table 

restituirà immediatamente solo i nomi delle colonne o continuerà a analizzare l'intera tabella e alla fine restituisce zero risultati?

Ho una tabella di produzione con 10.000 righe: controllerà la condizione WHERE su ogni riga?

+10

L'ottimizzatore di query SQL Server è abbastanza intelligente per capire che 'dove 0 = 1' può *** *** mai e poi mai essere vero e quindi non preoccuparsi di verificare tutte le righe - inutile .... –

+0

e altri server come oracle sono troppo intelligenti? – Friendy

+4

La maggior parte di loro, se non tutti, probabilmente sono ... –

risposta

30

La query SQL Server ottimizzatore è abbastanza intelligente per capire che questa condizione può WHEREmai produrre un risultato true su qualsiasi riga, in modo che non si preoccupa in realtà leggendo la tabella.

Se si guarda al piano di esecuzione effettivo per una query, è facile vedere che nulla è stato fatto e la query restituisce immediatamente:

enter image description here

+0

Ciao @Marc_S, il tuo link immagine non funziona ora. quindi per favore puoi aggiornarlo. – Ajay2707

+1

@ Ajay2707 è lì. Cosa intendi con "non funziona"? – zerkms

+0

@ Ajay2707: non è un collegamento - è solo uno screenshot semplice ... –

2

Sia query viene utilizzato per ottenere un set vuoto di tabella;

SELECT TOP 0 * FROM table 
SELECT * FROM table WHERE 0=1 

Oltre che per raggiungere di seguito le cose:

  1. Per ottenere stessa struttura del nome di colonna
  2. usate per i dettagli delle colonne ritorno, ma non ci sono dati
  3. e vogliono interrogare per verificare la connettività
+0

sì, lo sto già utilizzando per il carico utile di un widget di ricerca mentre mostra dati zero ma i nomi delle colonne, ero solo preoccupato di esso verrà analizzato in modo completo tavolo o no. – Friendy

+0

restituisce solo il nome della colonna, quindi non preoccuparti di usare 0 = 1. –

5

Nella query

la clausola WHERE non sarà mai vera, quindi SQL Server non eseguirà la scansione di tutta la tabella.

E nella query

SELECT TOP 0 * FROM table 

si specifica TOP 0 modo SQL Server è molto intelligente in modo che non analizza il tuo tavolo per la restituzione di 0 righe.

Entrambe le query restituiranno solo le intestazioni di colonna.

15

MySql è abbastanza intelligente da rilevarlo e sa che è impossibile farlo.

desc SELECT * FROM table WHERE 0=1; 

enter image description here

+0

super grazie per la risposta aggiuntiva :) – Friendy