Почему этот запрос быстрее с несколькими вариантами выбора, а не между ними? - PullRequest
2 голосов
/ 14 мая 2009

У меня есть таблица в 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?

Ответы [ 2 ]

11 голосов
/ 14 мая 2009

Попробуйте использовать «Показать фактический план выполнения» в анализаторе запросов, и вы увидите, что второй запрос, вероятно, достигает результатов, выполняя поиск по индексу, тогда как первый (более медленный) не может этого сделать, потому что он не не знаю, что записи являются последовательными, поскольку используемый ими индекс не является кластеризованным.

2 голосов
/ 14 мая 2009

Поскольку в союзах эти заявления являются взаимоисключающими, я бы сказал, что объединение всех - лучший выбор, чем объединение. Это создаст меньше работы для сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...