2011-12-02 17 views
6

En varias consultas SQL, necesito verificar si un campo comienza con un carácter. Hay varias formas de hacerlo, ¿cuál es mejor en rendimiento/estándar?En SQL Server (2008), si quiero filtrar un campo de cadena que comienza con algo, ¿cuál es la mejor manera?

lo general el uso

tb.field LIKE 'C%' 

pero también se puede utilizar

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

conozco bien los usos de cada caso, pero no en términos de rendimiento.

+0

No sé a ciencia cierta, pero me imagino que el primer ejemplo, porque en el segundo que está haciendo un ajuste y luego ir sobre todos los resultados de nuevo para encontrar 'C' –

+5

Buena pregunta, pero la mejor manera de descubrir esto es ver sus planes de ejecución reales y ver dónde son diferentes. –

Respuesta

5

I'd ir con el primero LIKE C%, utilizará un índice en el campo si hay uno en lugar de tener que hacer un escaneo de tabla completa.

Si realmente necesita incluir el espacio en blanco LTRIM recorte en la consulta, puede crear una columna calculada persistente con el valor LEFT(LTRIM(tb.Field), 1) y poner un índice sobre ella.

4

LIKE 'C%' va a funcionar mejor que LEFT(LTRIM()).

El predicado LIKE aún puede usar un índice de soporte para obtener los datos que está buscando. I

Sin embargo, cuando SQL Server encuentra LEFT(LTRIM(tb.Field), 1) = 'C', la base de datos no puede determinar lo que quiere decir. Para realizar una coincidencia, SQL Server debe escanear cada fila, LTRIM los datos y luego examinar el primer carácter. El resultado final es, muy probablemente, una exploración completa de la tabla.

0

La primera consulta es solo un poco más que la otra. Lo he medido con mi script de medición de velocidad de consulta. Inténtelo usted mismo:

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 
Cuestiones relacionadas