Медленный поиск в большой таблице 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, представления иногда становятся неприятными, и мы до сих пор не знаем, является ли это простым представлением или вложенным, с несколькими вложенными в него представлениями.
Временами, когда я зацикливаюсь на подобных проблемах, я просто пытаюсь посмотреть код представления, встроить его определение в мой проблемный запрос и затем увидеть план выполнения. Как-то, как я заметил, оптимизатор не всегда может хорошо работать с вложенными представлениями.