EXISTS
controllerà se esiste un record in un set. quindi se stai facendo un SELECT da 1 milione di record o stai facendo un SELECT da 1 record (diciamo usando TOP 1), avranno lo stesso risultato e le stesse performance e lo stesso piano di esecuzione. (perché?) Perché esiste non attende fino a 1 milione di scansione del record completata (o 1 scansione del record completata). Ogni volta che trova un record in un set, verrà restituito il risultato come TRUE (In questo caso non è importante utilizzare * o il nome della colonna avrà lo stesso risultato di prestazioni).
USE pubs
GO
IF EXISTS(SELECT * FROM dbo.titleauthor)
PRINT 'a'
IF EXISTS(SELECT TOP 1 * FROM dbo.titleauthor)
PRINT 'b'
sotto è il piano di esecuzione per queste query (come ho problema dimensioni dello schermo, ho ritagliato la sua immagine)
Ma questo scenario e le prestazioni ed anche piano di esecuzione sarà un cambiamento completamente , quando si utilizza query come segue (non so perché dovrebbe utilizzare questa query!):
USE pubs
GO
IF EXISTS(SELECT * FROM dbo.titleauthor)
PRINT 'a'
IF EXISTS(SELECT 1)
PRINT 'b'
in questo scenario, come SQL Server non ha bisogno di Perfo rm qualsiasi operazione di scansione a seconda query, quindi il piano di esecuzione verrà modificato come segue:
fonte
2014-11-07 12:58:10
'termini select' in' sottoquery exists' vengono ignorate, rendendo questa scelta una questione di preferenza. –
Non importa. entrambi hanno la stessa performance –
Non uso mai SELECT 1 perché sembra brutto e mi dice che il programmatore si è preoccupato troppo delle prestazioni senza sapere come funziona davvero. –