2010-09-30 25 views
10

Esta es una pregunta basada en el rendimiento, no en una pregunta "I don't understand" o "best practice".Rendimiento relativo en SQLServer of Substring frente a un combo Right-Left

Tengo un campo varchar en una base de datos SQLServer que garantiza que es más largo que 7 caracteres. Necesito extraer un campo char (4) que consta de los 2º, 3º, 4º y 5º caracteres del varchar.

Por ejemplo, si el varchar tuviera el valor 1234567890, estaría buscando la pieza 2345.

¿Hay algún beneficio de rendimiento en el uso de una subcadena sobre un combo de derecha a izquierda?

SELECT SUBSTRING(account,2,4) FROM payment 

o

SELECT RIGHT(LEFT(account,5),4) FROM payment 

he notado una ligero ventaja mediante el uso de una derecha-izquierda sobre una mesa con 1,760,335 registros, pero no estoy seguro de si esto es debido a las consultas de caché o el me gusta.

ACTUALIZACIÓN He hecho un poco más de deberes. Parece que en este caso la derecha-izquierda se realiza finalmente como una subcadena derecha. ¿Es esta una regla? o es solo la forma en que SQLServer decidió desollar a este gato en particular? alt text

+0

única manera de estar seguro en su caso es comparar ... –

Respuesta

2

+1 para una pregunta interesante. Su evaluación de que SQL Server puede cambiar significativamente cada declaración a través de la optimización es probablemente exacta; Igual que su evaluación de que en un conjunto tan grande, SQL Server puede almacenar en caché una consulta mejor que otra. otros

Dos cosas vienen a la mente que podría ser (vagamente) relevante:

  • El consumo de memoria; Me gustaría saber si el combo IZQUIERDA/DERECHA consume un poco más de memoria. En teoría, el valor de retorno de la primera función debería almacenarse para poder pasar a la segunda función, aunque el mismo registro podría usarse una y otra vez.

  • Comprobación de los límites. Un varchar es básicamente un puntero al comienzo de un char [] con 2 bytes adicionales para indicar la longitud. Esto sugiere que debería realizarse algún tipo de comprobación de límites cuando se accede a un valor por un índice mirando el valor contenido en esos 2 bytes para asegurarse de que no estaba fuera de rango.

SQL Server también es muy indulgente al realizar solicitudes fuera de los límites de la cadena con caracteres y varchars. El siguiente código se ejecutará sin ningún error.

DECLARE @Test varchar(50); 
SET @Test = 'Hello World'; 
SELECT substring(@Test, 2, 4); 
SELECT substring(@Test, 2000, 5000); 

Lo mismo ocurrirá:

SELECT right(left(@test, 500), 400); 

Mi conjetura es que la explicación para la respuesta a su pregunta se encuentra en algo relacionado; desafortunadamente no conozco saber la respuesta a su pregunta.

Me gustaría saber si obtuviste los mismos resultados de rendimiento usando una cadena más larga, o una char contra una varchar. Esas pruebas podrían arrojar más información sobre los aspectos internos de SQL Server.

Cuestiones relacionadas