2010-05-17 4 views
1

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

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

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 

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

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

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

ответ

0

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

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

+0

Ах, большое спасибо. Из любопытства, каковы теги, используемые для создания частей моих вопросов в форме кода, как вы это делали выше? Большое спасибо – Adam

+0

@Adam: просто введите 4 пробела в свой код. или выделите весь свой код, затем нажмите значок 101010 (следующий значок двойной цитаты (рядом с значком земли)) – Hao

+0

Большое спасибо за все быстрые ответы – Adam

0

FWIW, это справедливо SQL:

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

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

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