Ваш ORDER BY не является стабильным видом;он сортирует данные по одной из двух категорий, но недостаточно детально определяет, как элементы должны быть отсортированы в этой категории. Это означает, что в форме TOP 5 sqlserver может свободно выбирать стратегию доступа к данным, что означает, что он может легко остановиться после того, как найдет 5 строк, данные которых таковы, что case when
возвращает 0
Предположим, у вас есть этот выводот SELECT * ... ORDER BY Category
Category, Thing
Animal, Cat
Animal, Dog
Animal, Goat
Vegetable, Potato
Vegetable, Turnip
Vegetable, Swede
Существует абсолютно никаких гарантий , что если вы сделаете SELECT TOP 2 * ... ORDER BY category
, вы получите "Cat, Dog" в этом порядке. Вы можете разумно получить «Козел, Собака» сегодня и «Кошка, Козел» завтра, когда SQL-сервер перетасовал свои индексы после добавления новых данных. Единственная вещь, которую вы можете гарантировать с помощью топ-2 по категориям, заключается в том, что, если в БД есть как минимум два животных, и нет новой категории, которая в алфавитном порядке раньше, чем «животное», вы получите два животных
Так ли это, потому что оптимизация TOP N означает, что sqlserver может остановиться рано, если у него есть N строк, соответствующих критериям;ему не нужно обращаться и сортировать миллион строк, если он уже нашел 5 строк, которые имеют категорию, которая будет первой в сортировке. Давайте представим, что он может знать различные значения и количество этих значений в столбце как часть своей статистики, он может сортировать эти различные значения, чтобы узнать, какие из них будут первыми, а затем пойти и найти любые 5 случайных строк, которые имеют значение, которое будетсначала отсортируйте и верните их. По сути, сервер sql может подумать: «Я знаю, что у меня есть 3« животных », а животные стоят перед всем остальным, а пользователь хочет 2. Я просто начну читать строки и остановлюсь после того, как получу 2 животных», а не «Я прочитаю». каждую вещь, отсортируйте все миллионы по категориям, затем возьмите первые 2 строки "
Это может быть намного быстрее, чем сортировка миллиона строк с последующим извлечением первых X
. когда вам нужно сделать сортировку стабильной, указав условия сортировки, которые гарантируют, что Вещи в категории будут отсортированы вплоть до того места, где нет двусмысленности
Добавьте больше столбцов в ваш заказ, чтобы каждая строказанимает гарантированное место в общем порядке, тогда сортировка будет стабильной, и TOP N будет возвращать одни и те же строки каждый раз. Чтобы сделать сортировку стабильной, коллекция столбцов, по которой вы сортируете, должна иметь уникальную комбинацию значений. Вы можете отсортировать по 20 столбцам, но если есть строки, в которых все 30 из этих столбцов имеют одинаковые значения (а дифференцирование происходит только по 21-му значению, по которому вы не упорядочиваете), то порядок сортировки не гарантируется