Вопрос
Мне нужно проверить, существует ли строка в базе данных;тем не менее, я пытаюсь найти способ сделать это, который обеспечивает наилучшую производительность.Это лучше всего резюмировать на примере.
Давайте предположим, что у меня есть следующая таблица:
dbo.Person(
FirstName varchar(50),
LastName varchar(50),
Company varchar(50)
)
Предположим, что эта таблица содержит миллионы строк, однако ТОЛЬКО столбец Company
имеет индекс.
Я хочу выяснить, является ли конкретная комбинация FirstName
, LastName
и Company
существует.Я знаю, что смогу это сделать:
IF EXISTS(select 1 from dbo.Person where FirstName = @FirstName and LastName = @LastName and Company = @Company)
Begin
....
End
Однако, если я не ошибаюсь, это приведет к полному сканированию таблицы.
Что бы мне действительно хотелось, чтобы он делал, так это запрос, в котором он использует индекс.Из приведенной выше таблицы я знаю, что следующий запрос будет иметь отличную производительность, поскольку он использует индекс:
Select * from dbo.Person where Company = @Company
Можно ли в любом случае выполнить поиск только по этому подмножеству данных?например ,что - то вроде этого:
select * from (
Select * from dbo.Person where Company = @Company
)
where FirstName = @FirstName and LastName = @LastName
Таким образом, он будет выполнять сканирование таблицы только для гораздо более узкого набора данных.
Я знаю, что приведенный выше запрос не сработает, но есть ли запрос, который сработал бы?
Да, и я не могу создавать временные таблицы, так как у пользователя будет доступ только на чтение.
Решение
IF EXISTS( ...)
это самая быстрая форма.Оптимизатор будет использовать доступный индекс для выполнения условия фильтрации, если он вычислит индекс быстрее. IF EXISTS
завершится, как только будет найдена строка.
Убедитесь, что ваша статистика актуальна...
Другие советы
FWIW, это действительный SQL:
select *
from (select * from dbo.Person where Company = @Company) t
where t.FirstName = @FirstName and t.LastName = @LastName
И только отличается от вашего запроса псевдонимами. То IF EXISTS
будет быстрее, как говорит Митч в своем посте.
Вы можете использовать анализатор запроса, чтобы узнать, что оптимизатор решит сделать.