Вопрос

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

Давайте предположим, что у меня есть следующая таблица:

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 будет быстрее, как говорит Митч в своем посте.

Вы можете использовать анализатор запроса, чтобы узнать, что оптимизатор решит сделать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top