¿Cómo se realizan búsquedas de texto completo con varios criterios en tablas unidas a la izquierda en SQL Server?

StackOverflow https://stackoverflow.com/questions/35954

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo una consulta que originalmente se ve así:

select c.Id, c.Name, c.CountryCode, c.CustomerNumber, cacc.AccountNumber, ca.Line1, ca.CityName, ca.PostalCode
from dbo.Customer as c
left join dbo.CustomerAddress as ca on ca.CustomerId = c.Id
left join dbo.CustomerAccount as cacc on cacc.CustomerId = c.Id
where  c.CountryCode = 'XX' and (cacc.AccountNumber like '%C17%' or c.Name like '%op%'       
or ca.Line1 like '%ae%' or ca.CityName like '%ab%' or ca.PostalCode like '%10%')

En una base de datos con 90.000 registros, esta consulta tarda unos 7 segundos en ejecutarse (obviamente, todas las uniones y me gusta son agotadoras).

He estado tratando de encontrar una manera de reducir el tiempo de ejecución de la consulta con una búsqueda de texto completo en las columnas en cuestión.Sin embargo, no he visto un ejemplo de una búsqueda de texto completo que tenga tres combinaciones de tablas como esta, especialmente porque mi condición de combinación no forma parte del término de búsqueda.

¿Hay alguna manera de hacer esto en la búsqueda de texto completo?


@David

Sí, hay índices en los ID.

Intenté agregar índices en la dirección del cliente (nombre de la ciudad, código postal, etc.) y redujo la consulta a 3 segundos, pero todavía lo encuentro demasiado lento para algo como esto.

Tenga en cuenta que todos los campos de texto (con excepción de los identificadores) son nvarchars y Line1 es un nvarchar 1000, por lo que eso podría afectar la velocidad, pero aún así.

¿Fue útil?

Solución

Ejecútelo a través del analizador de consultas y vea cuál es el plan de consulta.Supongo que la raíz doble (es decir,Las búsquedas de %ae%) hacen que realice un escaneo de la tabla cuando busca las filas coincidentes.Las búsquedas de doble raíz son intrínsecamente lentas, ya que normalmente no se puede utilizar ningún tipo de índice para hacerlas coincidir.

Otros consejos

NOTA:Esto no es realmente una respuesta, solo un intento de aclarar qué podría estar causando realmente los problemas de rendimiento.

90.000 registros es en realidad un conjunto de datos bastante pequeño y la consulta es relativamente simple con solo dos combinaciones.¿Tiene índices en CustomerAddress.CustomerId y CustomerAccount.CustomerId?Parece más probable que eso esté causando problemas de rendimiento que los predicados LIKE de la condición Where.¿Normalmente busca encontrar una coincidencia en todas esas columnas al mismo tiempo?

Me hago eco de la sugerencia de David.Probablemente desee examinar cómo el RDBMS ejecuta su consulta (por ejemplo, mediante escaneos de tablas o usando índices).

Una comprobación rápida sería cronometrar sólo la parte de la consulta que implica la búsqueda de texto.Algo como esto:

SELECT  ca.Line1, ca.CityName, ca.PostalCode
FROM    CustomerAddress as ca
WHERE   ca.CustomerId = <some id number>
AND     (ca.Line1 LIKE '%ae%' OR ca.CityName LIKE '%ab%' OR ca.PostalCode LIKE '%10%');

Si eso lleva mucho tiempo, entonces el LIKEs son el problema (elimine una expresión a la vez del ORlínea editada para ver si solo una de esas columnas está causando la desaceleración).Si es rápido, entonces las uniones son sospechosas.

También podría escribir una consulta similar para la tabla CustomerAccount.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top