Альтернативный способ оптимизации оператора LIKE в T- SQL - PullRequest
0 голосов
/ 27 марта 2020

Мне нужно выполнить следующую операцию:

select * from customer_details
where
Case When @LicenseNo != '' Then  dbo.customer_details.LicenseNo Else '' End LIKE  
'%' + @LicenseNo + '%'             
And Case When @EmailAddress = '' Then '' Else dbo.customer_details.ContactEmail End  LIKE  
'%'+  @EmailAddress+ '%' 

Это запрос Dynami c, выполненный из хранимой процедуры. При использовании оператора LIKE выполнение запроса будет очень медленным. Как оптимизировать этот тип запроса?

В столбце «Адрес электронной почты» указаны значения «NULL», а также более одной записи с одним и тем же адресом электронной почты. Поэтому я не могу создать полнотекстовый индекс.

Есть ли альтернативный способ оптимизации этого типа запроса

1 Ответ

0 голосов
/ 27 марта 2020

Полнотекстовый поиск будет лучшим вариантом. может улучшить запрос, если вы можете разбить его на 4 меньших запроса, и выполнять «дорогие» только в случае необходимости. Для этого вам понадобится использовать процедурную логику c в хранимой процедуре, а не в одном запросе.

Идея состоит в том, что вы сначала выполняете «самые дешевые» запросы и сразу же возвращаетесь, если получите результаты вашего бизнеса диктует логика c; если вы не получаете результатов, вы выполняете следующий самый дешевый запрос и так далее. В зависимости от ваших данных, это может избавить вас от выполнения дорогостоящих запросов "перехватить все".

У меня нет доступа к SQL Серверу прямо сейчас, поэтому я не могу написать фактический профи c, но это будет что-то вроде:

if @LicenseNo != '' and @EmailAddress != ''
  @result = select * from customer_details 
  where LicenseNo LIKE  @LicenseNo + '%'
  and   EmailAddress like @EmailAddress + '%'
  if %result 
    return %result
  else
    @result = select * from customer_details 
    where LicenseNo LIKE  '%' + @LicenseNo + '%'
    and   EmailAddress like @EmailAddress + '%'
    if %result 
      return
    end
   else
    @result = select * from customer_details 
    where LicenseNo LIKE  '%' + @LicenseNo + '%'
    and   EmailAddress like '%' + @EmailAddress + '%'
    if %result 
      return
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...