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


82

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


5
아마도 다음과 같은 문 생성이있을 수 있습니다. "SELECT TOP {0} PERCENT ..."
Michael Petrotta

당신의 첫 문장이 내 숨겨진 질문의 답이되었습니다.
Muhammad Ashikuzzaman

나는 최고 99.9999999 PERCENT를 사용하며 항상 작동합니다. 충분히 가깝습니다. 나는 예상되는 레코드 수에 따라 '9'를 추가하는 경향이 있습니다. 더 많은 레코드, 더 많은 9, 그리고 그것은 항상 작동합니다. SQL 2008에서 SQL 2017까지 사용했습니다.
pedi

답변:


51

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

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

두 번째 쿼리가 실패하는 이유는 무엇입니까? 내부 쿼리가 (필연적으로) 완전히 평가되지 않기 때문에?
Kenny Evitt 2013

두 번째 링크는 임시 테이블을 만드는 것이 때때로 극적인 성능 향상을 가져 오는 이유를 설명합니다!
Kenny Evitt 2013

41

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

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

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


이것은 사실이 아닙니다. 자세한 내용은 @gbn의 답변 에서이 링크 를 참조 하십시오.
Kenny Evitt 2013

3
당신이 참조하는 링크는 SELECT TOP (100) PERCENT .. ORDER BY에 대해 아무 의미가 없습니다. 링크는 SELECT TOP (2147483647) .. ORDER BY의 사용을 언급합니다. 현재 SQL Server 최적화 프로그램은 의미가 없기 때문에 SELECT TOP (100) PERCENT .. ORDER BY를 제거합니다. 이 조합은 항상 TOP / ORDER BY없이 SELECT와 동일한 행 컬렉션을 정의합니다. 옵티마이 저는 현재 2147483647이 모든 행을 포함하는지 여부를 확인하지 않으므로이 경우 TOP-ORDER BY 조합을 제거하지 않습니다.
Steve Kass

2
링크는 실제로 다음과 같이 언급합니다 TOP (100) PERCENT. "... ORDER BY와 함께 TOP 100 PERCENT를 사용하여 임시 테이블을 제외하고 파생 테이블의 중간 구체화를 강제로 시도 할 수 있습니다. 불행히도 SQL Server 쿼리 최적화 팀은 이것이 아니라고 결정했습니다. 좋은 생각이며 최적화 프로그램은 이제 이러한 시도를 무시합니다. " 그것은 사실 당신을 뒷받침합니다.
Kenny Evitt 2013-08-02


1
내가 마음을 바꿨 기 때문에 당신은 아마도 혼란 스러울 것입니다. 내 첫 번째 의견이 잘못되었습니다. 네가 옳아.
Kenny Evitt 2013-08-02

23

... 뷰 정의에서 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. 캡슐화로 인해 뷰의 순서가 명확하지 않습니다. 그렇다고 다른 정렬 순서로 여러보기를 만들어야한다는 의미는 아닙니다.

6

ORDER BY절이 없으면 TOP 100 PERCENT중복됩니다. (당신이 언급했듯이 이것은 조회수가있는 '속임수'였습니다)

[최적화 프로그램이이를 최적화하기를 바랍니다.]


5

SELECT TOP 100 PERCENT를 사용하는 상속받은 다른 코드를 보았습니다.

그 이유는 간단합니다. Enterprise Manager는 유용하게 사용하고이를 포함하도록 코드 형식을 지정했습니다. 실제로 아무것도 손상시키지 않았으므로 제거하려고 할 필요가 없었으며 다음에 변경하려고 할 때 EM이 다시 삽입합니다.


4

이유는 없지만 무관심한 것 같아요.

이러한 쿼리 문자열은 일반적으로 그래픽 쿼리 도구에 의해 생성됩니다. 사용자는 몇 개의 테이블을 조인하고 필터, 정렬 순서를 추가하고 결과를 테스트합니다. 사용자가 쿼리를보기로 저장하기를 원할 수 있으므로 도구는 TOP 100 PERCENT를 추가합니다. 하지만이 경우 사용자는 SQL을 자신의 코드에 복사하고 WHERE 절을 매개 변수화 한 다음 데이터 액세스 계층의 모든 항목을 숨 깁니다. 마음에서, 시야에서.


1

친절하게 아래를 시도하십시오, 그것이 당신을 위해 일하기를 바랍니다.

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

1

오류는 모든 것을 말합니다 ...

메시지 1033, 수준 15, 상태 1, 프로 시저 TestView, 줄 5 TOP, OFFSET 또는 FOR XML도 지정되지 않은 경우 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블 식에서 ORDER BY 절이 유효하지 않습니다.

TOP 100 PERCENT, 사용 하지 마십시오 TOP n. 여기서 N은 숫자입니다.

SQL Server VIEW (2012 이후 버전)에서 TOP 100 PERCENT (내가 모르는 이유)는 무시되지만 MS는 구문상의 이유로 유지했다고 생각합니다. TOP n이 더 좋으며 뷰 내에서 작동하고 뷰가 처음에 사용될 때 원하는 방식으로 정렬되지만 주의하십시오 .


0

결과에 변수를 사용할 수 있다고 가정하지만 뷰에서 ORDER BY 조각을 얻는 것 외에는 암시 적으로 "TOP 100 PERCENT"를 지정하여 이점을 보지 못할 것입니다.

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

2
문제는 Why use Select Top 100 Percent퍼센트에 대한 변수 개수를 얻는 것이 아닙니다.
bummi 2014

0

이것을 시도해보십시오, 그것은 거의 그 자체를 설명합니다. 다음 경우를 제외하고는 ORDER BY로 뷰를 만들 수 없습니다.

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

메시지 1033, 수준 15, 상태 1, 프로 시저 TestView, 줄 5 TOP, OFFSET 또는 FOR XML도 지정되지 않은 경우 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블 식에서 ORDER BY 절이 유효하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.