Зачем использовать Select Top 100 процентов?
Я понимаю, что до SQL Server 2005, вы можете "обмануть" SQL Server, чтобы разрешить использование order by в определении представления, а также включить TOP 100 PERCENT на выберите предложения. Но я видел другой код, который я унаследовал, который использует SELECT TOP 100 PERCENT ... внутри динамических операторов SQL (используется в АДО на ASP.NET приложения, и т. д.). Есть ли для этого какая-то причина? Разве результат не такой же, как не в том числе TOP 100 PERCENT?
9 ответов:
Он был использован для "промежуточная материализация (поиск Google)"
хорошая статья: Адам Маханик: исследование секретов промежуточной материализации
Он даже поднял MS Connect так что это можно сделать более чистым способом
мое мнение "не по своей сути плохо", но не используйте его, если не уверены на 100%. Проблема в том, что он работает только в то время, когда вы это делаете, и, вероятно, не позже (уровень патча, схема, индекс, количество строк и т. д.)...
работалаэто может не получиться, потому что вы не знаете, в каком порядке вещи оцениваются
SELECT foo From MyTable WHERE ISNUMERIC (foo) = 1 AND CAST(foo AS int) > 100и это может также потерпеть неудачу, потому что
SELECT foo FROM (SELECT foo From MyTable WHERE ISNUMERIC (foo) = 1) bar WHERE CAST(foo AS int) > 100однако это не было в SQL Server 2000. Внутренний запрос оценивается и буферизуется:
SELECT foo FROM (SELECT TOP 100 PERCENT foo From MyTable WHERE ISNUMERIC (foo) = 1 ORDER BY foo) bar WHERE CAST(foo AS int) > 100обратите внимание, что это все еще работает в SQL Server 2005
SELECT TOP 2000000000 ... ORDER BY...
TOP (100) процентов совершенно бессмысленно в последних версиях SQL Server, и он (вместе с соответствующим порядком, в случае определения представления или производной таблицы) игнорируется обработчиком запросов.
вы правы, что когда-то это можно было использовать как трюк, но даже тогда это было ненадежно. К сожалению, некоторые графические инструменты Microsoft помещают это бессмысленное предложение.
А почему это может появиться в динамическом SQL, я понятия не имею. Ты исправьте, что для этого нет причин, и результат будет таким же без него (и снова, в случае определения представления или производной таблицы, без предложений TOP и ORDER BY).
...разрешить использование ORDER BY в определении представления.
Это не очень хорошая идея. Представление никогда не должно иметь определенного порядка.
заказ BY оказывает влияние на производительность - использование этого представления означает, что заказ BY появится в плане объяснения. Если у вас есть запрос, в котором представление соединяется с чем-либо в непосредственном запросе или ссылается на встроенное представление (факторинг CTE/subquery) - ORDER BY всегда выполняется до окончательного порядка BY (предполагая, что это было определено). Нет никакого преимущества для упорядочивания строк, которые не являются конечным результирующим набором, когда запрос не использует TOP (или LIMIT для MySQL/Postgres).
считаем:
CREATE VIEW my_view AS SELECT i.item_id, i.item_description, it.item_type_description FROM ITEMS i JOIN ITEM_TYPES it ON it.item_type_id = i.item_type_id ORDER BY i.item_description...
SELECT t.item_id, t.item_description, t.item_type_description FROM my_view t ORDER BY t.item_type_description... эквивалентно использованию:
SELECT t.item_id, t.item_description, t.item_type_description FROM (SELECT i.item_id, i.item_description, it.item_type_description FROM ITEMS i JOIN ITEM_TYPES it ON it.item_type_id = i.item_type_id ORDER BY i.item_description) t ORDER BY t.item_type_descriptionэто плохо, потому что:
- пример упорядочивает список первоначально по описанию элемента, а затем он переупорядочивается на основе описания типа элемента. Это впустую ресурсы в первой сортировке-работает как естьне значит он работает:
ORDER BY item_type_description, item_description- не очевидно, что представление упорядочено из-за инкапсуляции. Это не означает, что вы должны создавать несколько представлений с разными порядками сортировки...
Если нет
ORDER BYпунктеTOP 100 PERCENTизбыточна. (Как вы уже упоминали, это был "трюк" с видами)[надеюсь, оптимизатор будет оптимизировать это прочь.]
никаких причин, кроме безразличия, я бы предположил.
такие строки запроса обычно генерируются графическим инструментом запроса. Пользователь соединяет несколько таблиц, добавляет фильтр, порядок сортировки, и проверяет результаты. Поскольку пользователь может захотеть сохранить запрос в виде представления, инструмент добавляет верхний 100 процентов. Однако в этом случае пользователь копирует SQL в свой код, параметризует предложение WHERE и скрывает все на уровне доступа к данным. Из головы, с глаз долой.
Я видел другой код, который я унаследовал, который использует SELECT TOP 100 PERCENT
причина этого проста: Enterprise Manager пытался быть полезным и форматировать ваш код, чтобы включить это для вас. Не было никакого смысла когда-либо пытаться удалить его, так как это действительно ничего не повредило, и в следующий раз, когда вы пошли, чтобы изменить его, эм вставит его снова.
пожалуйста, попробуйте ниже, надеюсь, что это будет работать для вас.
SELECT TOP ( SELECT COUNT(foo) From MyTable WHERE ISNUMERIC (foo) = 1) * FROM bar WITH(NOLOCK) ORDER BY foo WHERE CAST(foo AS int) > 100 )
Я бы предположил, что вы можете использовать переменную в результате, но помимо получения заказа по частям в представлении, вы не увидите преимущества, неявно указав "TOP 100 PERCENT":
declare @t int set @t=100 select top (@t) percent * from tableOf
просто попробуйте это, он объясняет это в значительной степени сам. Вы не можете создать представление с помощью ORDER BY, за исключением if...
CREATE VIEW v_Test AS SELECT name FROM sysobjects ORDER BY name GOMsg 1033, Уровень 15, состояние 1, процедура TestView, строка 5 порядок по предложение недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросы и общие табличные выражения, если не указано значение TOP, OFFSET или FOR Также указывается XML.
Comments