Estoy trabajando en una condición de unión entre 2 tablas donde una de las columnas para coincidir es una concatenación de valores. Necesito unir columnA desde tableA a los primeros 2 caracteres de columnB desde tableB.Rendimiento de la comparación de SQL utilizando subcadena vs como con el comodín
He desarrollado 2 declaraciones diferentes para manejar esto y he intentado analizar el rendimiento de cada método.
Método 1:
ON tB.columnB like tA.columnA || '%'
Método 2:
ON substr(tB.columnB,1,2) = tA.columnA
El plan de ejecución de la consulta tiene mucho menos pasos Método 1 en comparación con el método 2, sin embargo, parece que el método 2 se ejecuta mucho Más rápido. Además, el plan de ejecución muestra un índice recomendado para el Método 2 que podría mejorar su rendimiento.
Estoy ejecutando esto en un IBM iSeries, aunque estaría interesado en las respuestas en un sentido general para aprender más sobre la optimización de consultas SQL.
¿Tiene sentido que el Método 2 se ejecute más rápido?
Esta pregunta SO es similar, pero parece que nadie proporcionó ninguna respuesta concreta a la diferencia de rendimiento de estos enfoques: T-SQL speed comparison between LEFT() vs. LIKE operator.
PD: El diseño de la tabla que requiere este tipo de unión no es algo que pueda cambiarse en este momento. Me doy cuenta de que tener los campos separados que contienen diferentes tipos de datos sería preferible.
¿INNER or OUTER JOIN? –
Esto es para una unión interna. Se uniría al tipo de hacer una diferencia? – Swoop
Bueno, probablemente sea un juego perdedor el adivinar qué está pasando en un optimizador de consultas. Pero sí, en este caso, si se trata de un UNIÓN INTERNA, el Método 1 requiere que se lea todo tA, mientras que el método 2 solo necesita leer tB. Dependiendo del número de filas, eso podría ser significativo y podría afectar el plan de ejecución. –