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
SELECT
consulta:Y los resultados:
El plan de ejecución, con solo dos filas por tabla (¡ciertamente no hay muchas filas!)
fuente
Si la
lastname
columna está indexada en al menos una de las tablas, entonces también podría usarLIKE
El 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 índicepersons2
que 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