Я понимаю, что вы не можете иметь ORDER BY
в виду. (По крайней мере, в SQL Server 2012 я работаю с)
Я также понимаю, что «правильный» способ сортировки представления заключается в том, чтобы ORDER BY
обойти SELECT
оператор, запрашивающий представление.
Но, будучи относительно новым для практического использования SQL и использования представлений, я хотел бы понять, почему это сделано так по замыслу. Если я правильно следил за историей, это когда-то было возможно и было явно удалено из SQL Server 2008 и т. Д. (Не указывайте точную версию).
Однако, лучшая причина, по которой я могу придумать, почему Microsoft удалила эту функцию, заключается в том, что «представление - это несортированный набор данных».
Я предполагаю, что есть веская логическая причина того, почему представление должно быть не отсортировано. Почему представление не может быть просто уплощенным набором данных? Почему конкретно не отсортировано? Не кажется сложным придумывать ситуации, когда (по крайней мере, мне / ИМХО) кажется совершенно интуитивно понятным иметь отсортированный вид.
источник
Ответы:
(Индексированные представления в стороне, конечно.)
Представление не материализуется - данные не сохраняются, так как их можно отсортировать? Представление похоже на хранимую процедуру, которая просто содержит
SELECT
без параметров ... оно не содержит данных, оно просто содержит определение запроса. Поскольку для разных ссылок на представление могут потребоваться данные, отсортированные по-разному, способ, которым вы делаете это - точно так же, как при выборе из таблицы, которая по определению также является несортированной коллекцией строк, - это включение порядка по во внешний запрос. ,Также, чтобы дать немного понимания истории. Вы никогда не могли бы поставить
ORDER BY
в точку зрения, в том числе и в том числеTOP
. И в этом случаеORDER BY
диктуется, какие строки были включеныTOP
, а не как они будут представлены. Так уж получилось, что в SQL Server 2000, еслиTOP
был100 PERCENT
или{some number >= number of rows in the table}
, оптимизатор был довольно упрощен, и в итоге он создал план с видом, который соответствуетTOP/ORDER BY
. Но такое поведение никогда не гарантировалось и не документировалось - на него просто полагались, основываясь на наблюдениях, что является плохой привычкой . Когда вышел SQL Server 2005, это поведение стало «ломаться» из-за изменений в оптимизаторе, которые привели к использованию различных планов и операторов - среди прочего,TOP / ORDER BY
будет игнорироваться полностью, если бы это былоTOP 100 PERCENT
. Некоторые клиенты жаловались на это так громко, что Microsoft выпустила флаг трассировки, чтобы восстановить прежнее поведение. Я не буду рассказывать вам, что это за флаг, потому что я не хочу, чтобы вы его использовали, и я хочу убедиться, что цель правильная - если вы хотите предсказуемый порядок сортировки, используйтеORDER BY
его для внешнего запроса.Подводя итог, а также проясните высказанное вами замечание: Microsoft ничего не удалила . Они сделали продукт лучше, и в качестве побочного эффекта это недокументированное, негарантированное поведение стало менее надежным. В целом, я думаю, что продукт лучше для него.
источник
TOP
выполняет операцию курсора над набором результатов. Поэтому он может иметь явный порядок.TOP 100 PERCENT / ORDER BY
и полностью удаляет его из плана. Попробуйте это.Если представление было разрешено сортировать, то каков должен быть порядок результатов здесь?
источник
одна возможность - избежать конфликтующих сортировок - если представление сортируется по одному порядку, а выборка по этому представлению сортируется по другому порядку (не зная о сортировке представления), это может привести к снижению производительности. Поэтому безопаснее оставить требование сортировки пользователю.
Еще одна причина, по которой сортировка связана с затратами на производительность, так зачем наказывать всех пользователей представления, когда сортировка нужна только некоторым пользователям.
источник
ANSI SQL допускает только самый
ORDER BY
внешний запрос по ряду причин, одна из которых заключается в том, что происходит, когда подвыбор / представление / CTE соединяется с другой таблицей, а внешний запрос имеет свойORDER BY
собственный.SQL-сервер никогда не поддерживал его внутри представления (если только вы не обманули его, используя,
TOP 100 PERCENT
который, по моему мнению, чаще всего вызывает ошибку).Даже если вы вызвали ошибку, результаты никогда не были надежными, и сортировка не всегда получалась так, как вы ожидали.
См. Это сообщение в блоге команды оптимизатора запросов для получения полного технического объяснения. ТОП 100 процентов ПОРЯДОК считается опасным.
источник
Представления ведут себя как таблицы, содержимое которых определяется результатами запроса.
Столы не имеют порядка; они просто мешки с рядами.
Поэтому у представлений тоже нет порядка. Вы можете отсортировать их, выбрав строки в определенном порядке.
источник
Один из ответов, который еще не дан, заключается в том, что «упорядочение по» может мешать продвижению предикатов, что может сильно повлиять на производительность.
Примером является представление, которое сворачивает большой набор данных в сводку из 10 строк, которая является топ-10 / Упорядочено:
Для того же случая с сильным предикатом:
Это все равно занимает столько же времени, потому что top / order by блокирует предикат от более раннего запуска в конвейере. Это может привести к обработке ненужных строк, и план будет аналогичен плану без предиката.
Должен ли толчок произойти до того, как будет сделан заказ, это действительно выбор разработчика и может изменить ответ. Чаще всего толчок является логическим намерением.
Использование «верхних 100 процентов» логически позволяет использовать предикатный толчок, однако реализация, к сожалению, игнорирует «порядок по» для этого случая и побеждает намерение.
Для реальных случаев использования хорошим компромиссом для двигателя было бы выполнение «заказа на тягу». Это позволило бы указывать «порядок по» в представлении (с верхними 100 процентами или без верха), и этот порядок используется только в том случае, если представление выбирается напрямую, без явного упорядочения, без объединений, без агрегатов, без цепочка представления и т. д. Оба перечисленных выше случая могут поддерживаться этой простой моделью.
источник
Вы можете создать представление, которое имеет порядок по и сохраняет порядок при запросе после:
выберите топ 99,9999999999999 процентов * из ..... упорядочить по
источник
SELECT TOP 100 PERCENT ...
?