2011-12-02 7 views
6

Su diverse query SQL è necessario verificare se un campo inizia con un carattere. Ci sono diversi modi per farlo, qual è il migliore in termini di prestazioni/standard?Su SQL Server (2008), se voglio filtrare un campo stringa che inizia con qualcosa, qual è il modo migliore?

Io di solito uso

tb.field LIKE 'C%' 

ma posso anche usare

LEFT(LTRIM(tb.Field),1) = 'C' 

conosco bene gli usi di ogni singolo caso, ma non in termini di prestazioni.

+0

non lo so per certo, ma immagino il primo esempio, perché nel secondo si sta facendo un assetto e poi andare oltre tutti i risultati di nuovo per trovare 'C' –

+5

Buono domanda, ma il modo migliore per scoprirlo è visualizzare i piani di esecuzione effettivi e vedere dove sono diversi. –

risposta

5

Vorrei andare con il primo LIKE C%, verrà utilizzato un indice sul campo se ce n'è uno invece di dover eseguire una scansione completa della tabella.

Se è davvero necessario includere lo spazio bianco LTRIM di ritaglio nella query, è possibile creare una colonna calcolata persistente con il valore LEFT(LTRIM(tb.Field), 1) e inserirvi un indice.

4

LIKE 'C%' ha prestazioni migliori rispetto a LEFT(LTRIM()).

Il predicato LIKE può ancora utilizzare un indice di supporto per ottenere i dati che stai cercando. I

Tuttavia, quando SQL Server rileva LEFT(LTRIM(tb.Field), 1) = 'C', il database non è in grado di determinare cosa si intende. Per eseguire una corrispondenza, SQL Server deve analizzare ogni riga, LTRIM, quindi esaminare il primo carattere. Il risultato finale è, molto probabilmente, una scansione completa della tabella.

0

La prima query è solo un po 'diversa dall'altra. L'ho misurato con il mio script di misurazione della velocità delle query. Provate voi stessi:

DECLARE @Measurements TABLE(
    MeasuredTime INT NOT NULL 
) 

DECLARE @ExecutionTime INT 
DECLARE @TimesMeasured INT 
SET @TimesMeasured = 0 


WHILE @TimesMeasured < 1000 
BEGIN 
    DECLARE @StartTime DATETIME 

    SET @StartTime = GETDATE() 

    -- your select .. or what every query 

    INSERT INTO @Measurements 
    SELECT DATEDIFF(millisecond, @StartTime, getdate()) 

    SET @TimesMeasured = @TimesMeasured + 1 
END 

SELECT @AvgTime = AVG(MeasuredTime) FROM @Measurements 
Problemi correlati