Como você pesquisa vários critérios em texto completo em tabelas unidas à esquerda no SQL Server?

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Eu tenho uma consulta que originalmente se parece com isto:

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%')

Em um banco de dados com 90.000 registros, essa consulta leva cerca de 7 segundos para ser executada (obviamente, todas as junções e curtidas são desgastantes).

Tenho tentado encontrar uma maneira de reduzir o tempo de execução da consulta com pesquisa de texto completo nas colunas em questão.No entanto, não vi um exemplo de pesquisa de texto completo que tenha três junções de tabelas como esta, especialmente porque minha condição de junção não faz parte do termo de pesquisa.

Existe uma maneira de fazer isso na pesquisa de texto completo?


@David

Sim, existem índices nos IDs.

Tentei adicionar índices no material CustomerAddress (CityName, PostalCode, etc.) e isso reduziu a consulta para 3 segundos, mas ainda acho isso muito lento para algo assim.

Observe que todos os campos de texto (com exceção dos ids) são nvarchars e a Linha1 é um nvarchar 1000, o que pode afetar a velocidade, mas ainda assim.

Foi útil?

Solução

Execute-o no analisador de consulta e veja qual é o plano de consulta.Meu palpite seria que a raiz dupla (ou seja,%ae%) pesquisas estão fazendo com que ele faça uma varredura na tabela ao procurar as linhas correspondentes.As pesquisas de raiz dupla são inerentemente lentas, pois normalmente você não pode usar nenhum tipo de índice para combiná-las.

Outras dicas

OBSERVAÇÃO:Esta não é realmente uma resposta, apenas uma tentativa de esclarecer o que realmente pode estar causando o(s) problema(s) de desempenho.

90.000 registros é realmente um conjunto de dados bastante pequeno e a consulta é relativamente simples com apenas duas junções.Você tem índices em CustomerAddress.CustomerId e CustomerAccount.CustomerId?Parece mais provável que isso esteja causando problemas de desempenho do que os predicados da condição LIKE.Você normalmente pesquisa uma correspondência em todas essas colunas ao mesmo tempo?

Eu repetiria a sugestão de David.Você provavelmente desejaria examinar como o RDBMS está executando sua consulta (por exemplo, por meio de varreduras de tabela ou usando índices).

Uma verificação rápida seria cronometrar apenas a parte da consulta que envolve a pesquisa de texto.Algo assim:

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%');

Se isso demorar muito, então o LIKEs são o problema (remova uma expressão de cada vez do ORed linha para ver se apenas uma dessas colunas está causando a lentidão).Se for rápido, as junções são suspeitas.

Você também pode escrever uma consulta semelhante para a tabela CustomerAccount.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top