При запросе таблицы SQL Server и ORDER BY в столбце, заполненном только «», я получаю разные результаты для TOP 1 по сравнению с TOP 5. Кажется, что первая запись игнорируется, а затем возвращается запрошенное количество записей - в обратном порядке.
-- Drop temp table if it exists
DROP TABLE IF EXISTS [tempdb]..[#OrderByTest];
-- Create temp table
CREATE TABLE [#OrderByTest]
(
TestValue VARCHAR(1),
TestName VARCHAR(20)
);
-- Populate temp table
INSERT INTO [#OrderByTest] (TestValue, TestName) VALUES
('', 'Bravo'),
('', 'Foxtrot'),
('', 'Charlie'),
('', 'Alpha'),
('', 'Delta'),
('', 'Echo'),
('', 'Golf'),
('', 'Hotel'),
('', 'Indigo'),
('', 'Juliet');
--SELECT * FROM #OrderByTest;
-- Query table for TOP 1 and ORDER BY
SELECT TOP 1 TestName FROM #OrderByTest ORDER BY TestValue;
-- Query table for TOP 5 and ORDER BY
SELECT TOP 5 TestName FROM #OrderByTest ORDER BY TestValue;
Я скорее ожидал, что ТОП-1 вернет Браво, так как это первый введенный рекорд. Я также ожидал, что ТОП-5 вернет Браво, за которым следуют Фокстрот, Чарли, Альфа и Дельта, поскольку это порядок, в котором были добавлены записи.
То, что я получаю в ТОП-1, - это всегда фокстрот, а в ТОП-5 я получаю Эхо, Дельта, Альфа, Чарли и Фокстрот. Кажется, что оператор TOP 5 игнорирует первую запись, а затем обращает вспять следующие 5 записей.
Это наблюдение верно, если я изменю ТОП-5 на ТОП-3, с тех пор я получаю Альфа, Чарли, Фокстрот.
Есть идеи о том, что происходит?
ORDER BY TestValue, TestName;
- person Cleptus   schedule 11.04.2019TestName
первичным ключом, хотя мы вообще не упоминаем об этом в запросе. Все эти заказы действительны. Тот факт, что этот порядок является стабильным при одинаковой структуре таблицы и данных, не должен вызывать особого удивления (алгоритм не является произвольным), но вы тоже не можете рассчитывать на это. - person Jeroen Mostert   schedule 11.04.2019DBCC PAGE
и реконструировать сортировку с помощью теста черного ящика или дизассемблера, но вы не можете использовать эти результаты для чего угодно, кроме удовлетворения вашего любопытства. Любой ответ, который объясняет, как именно оптимизатор получает результат, опасен в том смысле, что у людей может возникнуть соблазн использовать результаты, когда они могут быть признаны недействительными при самом следующем обновлении SQL Server. - person Jeroen Mostert   schedule 11.04.2019