developer tip

Select Top 100 %를 사용하는 이유는 무엇입니까?

copycodes 2020. 10. 10. 10:11
반응형

Select Top 100 %를 사용하는 이유는 무엇입니까?


나는 이전에 이해 SQL 서버 2005 도 포함하여, 당신이 "속임수"SQL 서버, 뷰 정의에 의해 주문의 사용을 허용 할 수 TOP 100 PERCENTSELECT 절. 그러나 SELECT TOP 100 PERCENT동적 SQL 문 내에서 ... ( ASP.NET 앱의 ADO 에서 사용됨) 를 사용하는 상속 된 다른 코드를 보았습니다 . 이것에 대한 이유가 있습니까? 결과는 포함 하지 않은 것과 동일 하지 않습니까?TOP 100 PERCENT


" 중간 구체화 (구글 검색) "에 사용되었습니다.

좋은 기사 : 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...

TOP (100) PERCENT는 최신 버전의 SQL Server에서 완전히 의미가 없으며 쿼리 프로세서에서 해당 ORDER BY와 함께 (뷰 정의 또는 파생 테이블의 경우) 무시됩니다.

옛날 옛적에 속임수로 사용될 수 있었지만 그 후에도 믿을 수 없었습니다. 안타깝게도 Microsoft의 그래픽 도구 중 일부는이 의미없는 절을 삽입했습니다.

이것이 동적 SQL에 나타나는 이유에 대해서는 전혀 모릅니다. 그럴 이유가 없다는 것이 맞으며, 결과는 그것 없이는 동일합니다 (그리고 다시 말하지만, 뷰 정의 또는 파생 테이블의 경우, TOP 및 ORDER BY 절이 모두 없음).


... 뷰 정의에서 ORDER BY 사용을 허용합니다.

그건 좋은 생각이 아니다. 뷰에는 ORDER BY가 정의되어서는 안됩니다.

ORDER BY는 성능에 영향을 미칩니다. 뷰를 사용하면 ORDER BY가 계획 설명에서 표시됩니다. 뷰가 즉시 쿼리의 모든 항목에 조인되거나 인라인 뷰 (CTE / 하위 쿼리 인수 분해)에서 참조되는 쿼리가있는 경우 ORDER BY는 항상 최종 ORDER BY (정의 된 것으로 가정)보다 먼저 실행됩니다. 쿼리가 TOP (또는 MySQL / Postgres의 경우 LIMIT)을 사용하지 않는 경우 최종 결과 집합이 아닌 행을 정렬해도 이점이 없습니다.

중히 여기다:

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. It's not obvious what the view is ordered by due to encapsulation. This does not mean you should create multiple views with different sort orders...

If there is no ORDER BY clause, then TOP 100 PERCENT is redundant. (As you mention, this was the 'trick' with views)

[Hopefully the optimizer will optimize this away.]


I have seen other code which I have inherited which uses SELECT TOP 100 PERCENT

The reason for this is simple: Enterprise Manager used to try to be helpful and format your code to include this for you. There was no point ever trying to remove it as it didn't really hurt anything and the next time you went to change it EM would insert it again.


No reason but indifference, I'd guess.

Such query strings are usually generated by a graphical query tool. The user joins a few tables, adds a filter, a sort order, and tests the results. Since the user may want to save the query as a view, the tool adds a TOP 100 PERCENT. In this case, though, the user copies the SQL into his code, parameterized the WHERE clause, and hides everything in a data access layer. Out of mind, out of sight.


Kindly try the below, Hope it will work for you.

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

I would suppose that you can use a variable in the result, but aside from getting the ORDER BY piece in a view, you will not see a benefit by implicitly stating "TOP 100 PERCENT":

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

Just try this, it explains it pretty much itself. You can't create a view with an ORDER BY except if...

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

Msg 1033, Level 15, State 1, Procedure TestView, Line 5 The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.


The error says it all...

Msg 1033, Level 15, State 1, Procedure TestView, Line 5 The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.

Don't use TOP 100 PERCENT, use TOP n, where N is a number

The TOP 100 PERCENT (for reasons I don't know) is ignored by SQL Server VIEW (post 2012 versions), but I think MS kept it for syntax reasons. TOP n is better and will work inside a view and sort it the way you want when a view is used initially, but be careful.

참고URL : https://stackoverflow.com/questions/1622878/why-use-select-top-100-percent

반응형