2016-12-18 2 views
1

У меня есть следующий запрос, который отлично выполняет работу, но мне интересно, есть ли лучший способ сделать это внутри предложения WHERE.Сохраненная процедура - Параметр поиска по нескольким столбцам

Любые комментарии/отзывы о его улучшении будут оценены.

SELECT 
    C.ClientID, 
    C.FirstName + ' ' + C.LastName as FullName, 
    C.DOB, 
    G.Gender, 
    G.GenderIcon, 
    C.VerificationCode, 
    MAX(V.StartDate) as LastVisitDate 
FROM 
    Client C 
LEFT JOIN 
    Visit V ON C.ClientID = V.ClientID 
INNER JOIN 
    Gender G ON C.GenderID = G.GenderID 
WHERE 
    (FirstName like '%' + @Criteria + '%' or 
    LastName like '%' + @Criteria + '%' or 
    VerificationCode like '%' + @Criteria + '%') 
+0

@JeroenMostert, почему бы не написать это как ответ ... на этот вопрос больше нет ответов !! – Hadi

+0

Спасибо @JeroenMostert, оцените ваш ответ. Как сказал Хади, не стесняйтесь публиковать это как ответ, и я соглашусь с ним. – Philip

+0

Могут быть другие ответы, но вы правы, это не должен быть комментарий. –

ответ

0

В отличие от поиска в полнотекстовом поиске, нет. Если один столбец имеет гораздо больше шансов содержать совпадения, чем другие, и у вас есть индексы покрытия, вы можете использовать три запроса и запускать их отдельно, но, учитывая возвращаемые столбцы, они, вероятно, все связаны с сканированием таблиц. Вы также можете сначала рассмотреть запрос для LIKE @Criteria + '%', так как он может использовать индекс для поддержки эффективного сканирования диапазона (более эффективно, чем чтение всех строк, в любом случае). Однако ничто из этого не улучшает худший случай.

+0

Благодарим за помощь – Philip

+0

Я думаю, что вы имели в виду Index Range Scan. Поскольку подстановочный знак «%» будет выполнять сканирование диапазона. Поиск ищет фиксированное и известное значение, тогда как '%' может иметь/сопоставлять несколько окончаний для '@ Criteria'. –

+0

@RaduGheorghiu: если в столбце есть индекс, для перехода к первой строке в диапазоне будет использоваться оператор поиска индекса. Остальная часть сканируется, вы совершенно правы, но это отличается от реального оператора сканирования индексов. Я думаю, это вопрос терминологии - я использую имена, которые использует сам движок. –

Смежные вопросы