SQL выбирает на подмножествах - PullRequest
1 голос
/ 17 мая 2010

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

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

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

Таким образом, сканирование таблицы будет выполняться только для гораздо более узкого набора данных.

Я знаю, что приведенный выше запрос не будет работать, но есть ли такой запрос?

О, и я не могу создать временные таблицы, так как у пользователя будет только доступ для чтения.

Ответы [ 2 ]

0 голосов
/ 17 мая 2010

FWIW, это действительный SQL:

select *
from (select * from dbo.Person where Company = @Company) t
where t.FirstName = @FirstName and t.LastName = @LastName

И отличается от вашего запроса только псевдонимом. IF EXISTS будет быстрее, как говорит Митч в своем посте.

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

0 голосов
/ 17 мая 2010

IF EXISTS( ...) самая быстрая форма. Оптимизатор будет использовать доступный индекс, чтобы удовлетворить условию фильтра, если он вычислит индекс быстрее. IF EXISTS завершит работу, как только будет найдена строка.

Убедитесь, что ваша статистика актуальна ...

...