У меня есть некоторый .NET-код, который проверяет наличие записи SQL в среднесрочном интервале. Я ищу, чтобы сделать эту проверку как можно "дешевой".
Мне интересно характеристики двух запросов:
IF EXISTS(SELECT 1
FROM BigTable
WHERE SomeColumn = 200)
SELECT 1 AS FOUND
ELSE
SELECT 0 AS FOUND
VS
SELECT TOP 1 1
FROM BigTable
WHERE SomeColumn = 200
Они оба производят аналогичные планы выполнения. Но SELECT TOP 1 1, кажется, выполняется быстрее: меньше запросов для синтаксического анализа и когда запись не найдена, она меньше передает трубку. Я также предполагаю, что он работает быстрее на клиенте, потому что мне просто нужно проверить счетчик записей, а не маршалировать возвращаемое значение IF EXISTS.
Большинство преимуществ производительности незначительны. Но если оба последовательно возвращают один и тот же результат, то почему бы не выбрать немного более быстрый метод?
Является ли "SELECT TOP 1 1" лучшим способом проверить наличие записи в .NET?
(Мы используем .NET 3.5, и я стараюсь избегать LINQ, потому что он не используется в другом месте приложения. У нас также есть некоторые устаревшие приложения VB6, которые мы переносим/переписываем, поэтому им также может понадобиться выполнить это.)
EDIT: Просто немного подробнее о дизайне. Эта запись является "заголовком". Существует еще одна таблица с дочерними записями, которая будет считана/проанализирована при обнаружении этого заголовка. Отсутствие записи - хорошая вещь: нет работы.
EDIT2: Отсутствие записи, которая удовлетворяет условию, будет происходить чаще. Они происходят спорадическими волнами.