Зачем использовать Select Top 100 процентов?



Я понимаю, что до SQL Server 2005, вы можете "обмануть" SQL Server, чтобы разрешить использование order by в определении представления, а также включить TOP 100 PERCENT на выберите предложения. Но я видел другой код, который я унаследовал, который использует SELECT TOP 100 PERCENT ... внутри динамических операторов SQL (используется в АДО на ASP.NET приложения, и т. д.). Есть ли для этого какая-то причина? Разве результат не такой же, как не в том числе TOP 100 PERCENT?

667   9  

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

это плохо, потому что:

  1. пример упорядочивает список первоначально по описанию элемента, а затем он переупорядочивается на основе описания типа элемента. Это впустую ресурсы в первой сортировке-работает как естьне значит он работает: ORDER BY item_type_description, item_description
  2. не очевидно, что представление упорядочено из-за инкапсуляции. Это не означает, что вы должны создавать несколько представлений с разными порядками сортировки...

Если нет 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
        GO

Msg 1033, Уровень 15, состояние 1, процедура TestView, строка 5 порядок по предложение недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросы и общие табличные выражения, если не указано значение TOP, OFFSET или FOR Также указывается XML.

Comments

    Ничего не найдено.