У меня есть таблица в Sql Server 2008 Express, которая содержит 18 миллионов записей.
Структура выглядит примерно так (упрощенно):
Id, GroupId, Значение, Создано
Идентификатор - это первичный ключ с кластеризованным индексом
GroupId - это некластеризованный индекс
В этом случае каждые 10 строк получают новый groupId, означающий, что записи 1-10 имеют GroupId 1, записи 11-20 имеют GroupId 2 и т. Д.
Тест 1: выполнение этого запроса занимает 23 секунды и возвращает 99 записей:
ОБЪЯВИТЬ @Start INT
SET @Start = 1050
выберите * из FieldValues, где GroupId между @Start и @Start + 10
Тест 2: выполнение этого запроса занимает 0 секунд и возвращает 99 записей:
ОБЪЯВИТЬ @Start INT
SET @Start = 1050
выберите * из FieldValues, где GroupId = @Start union
выберите * из FieldValues, где GroupId = @Start + 1 union
выберите * из FieldValues, где GroupId = @Start + 2 union
выберите * из FieldValues, где GroupId = @Start + 3 union
выберите * из FieldValues, где GroupId = @Start + 4 union
выберите * из FieldValues, где GroupId = @Start + 5 union
выберите * из FieldValues, где GroupId = @Start + 6 union
выберите * из FieldValues, где GroupId = @Start + 7 union
выберите * из FieldValues, где GroupId = @Start + 8 union
выберите * из FieldValues, где GroupId = @Start + 9 union
выберите * из FieldValues, где GroupId = @Start + 10
Примечание. Поскольку результаты могут кэшироваться, я всегда скремблирую переменную @Start между каждым тестом, чтобы получить оценки времени без кэширования.
Почему эти множественные селекторы (похоже, что некоторые новички набрали обороты) идут намного быстрее, чем более элегантный в тесте 1?