Медленный поиск в большой таблице SQL по нескольким столбцам

Я ищу более высокую производительность при поиске большой (>200000 строк) таблицы SQL-сервера по нескольким столбцам. Текущий код генерирует запрос что-то вроде

(
SELECT Person._pk 
FROM dbo.R_Person as Person 
WHERE Person._pk > 0 
AND Person.first_name LIKE 'jane%' 
AND Person.last_name LIKE 'morgan%' 
AND Person._pk IN (
    SELECT _pk FROM dbo.R_PersonView12 
)

когда поиск выполняется только по одному имени, он быстро возвращается, но при поиске как по первому, так и по последнему (часто требуется найти правильного человека, так как совпадений будет слишком много для одного из них), время выполнения становится неприемлемо высоким. Кто-нибудь может предложить другой способ сонструктурировать этот запрос для повышения производительности здесь?

3 ответа

Всегда лучше посмотреть на план запроса. Но вы могли бы попробовать это вместо этого:

SELECT Person._pk 
FROM dbo.R_Person as Person 
WHERE Person._pk > 0 
AND Person.first_name LIKE 'jane%' 
AND Person.last_name LIKE 'morgan%' 
AND EXISTS (
    SELECT 1 FROM dbo.R_PersonView12 V
    WHERE V._pk = Person._pk
)

Похоже, что у вас есть вид здесь - это тоже может быть проблемой. Опубликовать DDL.

И какие столбцы имеют индексы?

Вы должны добавить вычисляемое поле в Person как NameSurname . и создать индекс по нему.

изменить таблицу dbo.R_Person добавить ИмяФамилия как Имя +' '+ Фамилия

SELECT Person._pk 
FROM dbo.R_Person as Person 
WHERE Person._pk > 0 
AND Person.NameSurname  LIKE 'jane morgan%' 
AND EXISTS (
    SELECT 1 FROM dbo.R_PersonView12 V
    WHERE V._pk = Person._pk
)

Как уже упоминалось в ElectricLlama, представления иногда становятся неприятными, и мы до сих пор не знаем, является ли это простым представлением или вложенным, с несколькими вложенными в него представлениями.

Временами, когда я зацикливаюсь на подобных проблемах, я просто пытаюсь посмотреть код представления, встроить его определение в мой проблемный запрос и затем увидеть план выполнения. Как-то, как я заметил, оптимизатор не всегда может хорошо работать с вложенными представлениями.

Другие вопросы по тегам