select value 
from persons p join persons2 p2 
    on left(p.lastname,1) = left(p2.lastname,1)
Servidor SQL. ¿Hay alguna manera de hacer que este SARGable / funcione más rápido? No puedo crear columnas en la tabla de personas, pero puedo crear columnas en personas2.
                    
                        sql-server
                                
                    
                    
                        lastchancexi
fuente
                
                fuente

Respuestas:
Cree una vista en las tablas con una columna calculada persistente definida como la
LEFT(lastname, 1)de cada tabla, luego compare los valores de la columna persistente calculada.Aquí hay un banco de pruebas que muestra cómo hacerlo:
Aquí, insertaremos algunos datos de muestra:
Aquí está la
SELECTconsulta:Y los resultados:
El plan de ejecución, con solo dos filas por tabla (¡ciertamente no hay muchas filas!)
fuente
Si la
lastnamecolumna está indexada en al menos una de las tablas, entonces también podría usarLIKEEl plan para esto puede tener una búsqueda en la tabla especificada a la izquierda del similar.
es decir
ON p.lastname LIKE LEFT(p2.lastname, 1) + '%', no podría hacer uso del índicepersons2que se utilizó anteriormente, pero podría buscar unopersons.Sin embargo, la sugerencia en la otra respuesta de indexar una columna calculada en ambos lados es más flexible. En cuanto a un plan de bucles anidados, cualquier tabla puede estar en el interior y también permitiría una combinación de combinación de muchos a muchos sin requerir una clasificación.
fuente
Resulta que tengo una tabla con 3.423 filas y 195 valores distintos
Name. Llamaré a esta tablaP(persona) y la duplicaré para crearP2(persona2). Hay una clave primaria única y agrupada en una columna de ID de entero. Estoy usando Microsoft SQL Server 2016 (KB3194716) Developer Edition (64 bits) en Windows 10 Pro 6.3 con 32 GB de RAM.Con la consulta base
Me devuelven 1,5 millones de filas en 3200-3300 ms (de estadísticas io).
Al reescribir así:
el tiempo transcurrido se reduce a 50-60 ms y el plan es:
Se devuelven menos filas (3,423) debido al algoritmo de coincidencia. El mismo plan y recuento de filas se logra cambiando la consulta base a
select distinct.Al crear una columna indexada y calculada
El tiempo transcurrido cae a 45-50 ms.
fuente