Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Он использовался для промежуточной материализации (поиск Google)"

Хорошая статья: Adam Machanic: Изучение секретов промежуточной материализации

Он даже поднял 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...

Ответ 2

TOP (100) PERCENT совершенно бессмыслен в последних версиях SQL Server, и он (вместе с соответствующим ORDER BY, в случае определения представления или производной таблицы) игнорируется процессором запросов.

Вы правы, что когда-то это могло быть использовано в качестве трюка, но даже тогда оно не было надежным. К сожалению, некоторые из графических инструментов Microsoft помещают это бессмысленное предложение в.

Что касается того, почему это может появиться в динамическом SQL, я понятия не имею. Вы правы, что нет никаких причин для этого, и результат будет таким же без него (и опять же, в случае определения представления или производной таблицы, без предложений TOP и ORDER BY).

Ответ 3

... разрешить использование ORDER BY в определении представления.

Это не очень хорошая идея. В представлении никогда не должно быть установленного ORDER BY.

ORDER BY влияет на производительность - использование этого представления означает, что ORDER BY появится в плане объяснения. Если у вас есть запрос, в котором представление соединено с чем-либо в непосредственном запросе или ссылается во встроенном представлении (факторинг CTE/подзапрос), ORDER BY всегда запускается до окончательного ORDER 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
  • Не очевидно, что представление упорядочено из-за инкапсуляции. Это не значит, что вы должны создавать несколько представлений с разными порядками сортировки...

Ответ 4

Если не существует предложения ORDER BY, то TOP 100 PERCENT является избыточным. (Как вы упомянули, это был "трюк" с представлениями)

[Надеюсь, оптимизатор оптимизирует это.]

Ответ 5

Никакой причины, кроме равнодушия, я бы предположил.

Такие строки запросов обычно генерируются графическим инструментом запросов. Пользователь присоединяется к нескольким таблицам, добавляет фильтр, порядок сортировки и проверяет результаты. Поскольку пользователь может захотеть сохранить запрос в виде представления, инструмент добавляет TOP 100 PERCENT. В этом случае пользователь копирует SQL в свой код, параметризует предложение WHERE и скрывает все на уровне доступа к данным. Из виду, вне поля зрения.

Ответ 6

Я видел другой код, который унаследовал, который использует SELECT TOP 100 PERCENT

Причина этого проста: Enterprise Manager использовал, чтобы попытаться помочь и отформатировать ваш код, чтобы включить это для вас. Не было никакого смысла пытаться удалить его, поскольку это ни на что не повредило, и в следующий раз, когда вы пошли на его изменение, EM снова вставило его.

Ответ 7

Пожалуйста, попробуйте ниже, надеюсь, он будет работать на вас.

      SELECT TOP
              ( SELECT COUNT(foo) 
                  From MyTable 
                 WHERE ISNUMERIC (foo) = 1) * 
                  FROM bar WITH(NOLOCK) 
              ORDER BY foo
                 WHERE CAST(foo AS int) > 100
               )

Ответ 8

Я бы предположил, что вы можете использовать переменную в результате, но помимо получения части ORDER BY в представлении вы не увидите выгоды, неявно заявив "TOP 100 PERCENT":

declare @t int
set @t=100
select top (@t) percent * from tableOf

Ответ 9

Просто попробуйте это, это объясняет это в значительной степени. Вы не можете создать представление с помощью ORDER BY, за исключением случаев, когда...

CREATE VIEW v_Test
         AS
           SELECT name
             FROM sysobjects
         ORDER BY name
        GO

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