복붙노트

[SQL] 왜 사용을 선택 최고 100 %?

SQL

왜 사용을 선택 최고 100 %?

또한 SELECT 절에서 TOP 100 PERCENT를 포함하여 이전 SQL Server 2005로, 당신이 "속임수"SQL 서버, 뷰 정의에 의해 주문의 사용을 허용 할 수 있음을 이해합니다. 그러나 나는 (ASP.NET 응용 프로그램에서 ADO의 사용 등) 동적 SQL 문에서 ... SELECT TOP 100 PERCENT를 사용하여 내가 상속 다른 코드를 보았다. 이것에 대한 어떤 이유가 있나요? 결과가 동일하지 않은 TOP 100 PERCENT를 포함하지?

해결법

  1. ==============================

    1.그것은 "중간 구체화 (Google 검색)"을 위해 사용되었다

    그것은 "중간 구체화 (Google 검색)"을 위해 사용되었다

    좋은 기사 : 아담 Machanic는 : 중간 물질화의 비밀을 탐구

    그것이 청소기 방식으로 수행 할 수 있도록 그는 심지어 MS 연결을 제기

    내보기는 "본질적으로 나쁘지 않다", 그러나 확실히 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 서버 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. ==============================

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

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

    당신은 옛적에 한 번,이 트릭으로 사용하지만, 그렇다하더라도 그것을 믿을 수 없었다 될 수 있다는 맞아요. 슬프게도, 마이크로 소프트의 그래픽 도구 중 일부는이 의미 절을했습니다.

    이 동적 SQL에 나타날 수있는 이유에 관해서는, 나는 아무 생각이 없습니다. 거기에 대한 이유가 없다, 그 결과는 (BY 절 TOP 및 ORDER 모두 않고, 뷰 정의 또는 파생 테이블의 경우, 다시)없이 동일하다는 것을 당신이 맞아요.

  3. ==============================

    3.그건 좋은 생각이 아니다. 정의에 의해 뷰는 주문을하지 않아도됩니다.

    그건 좋은 생각이 아니다. 정의에 의해 뷰는 주문을하지 않아도됩니다.

    주문 BY 성능에 영향을 - 그것에게 ORDER BY는 설명 할 계획에 올려 것이라는 전망 수단을 사용하여. 당신이보기가 인라인 뷰 (CTE / 서브 쿼리 팩토링)에 즉시 쿼리에 아무것도에 가입하거나 참조하는 쿼리가있는 경우 - ORDER BY는 항상 (가 정의 된 가정) BY 최종 주문 전에 실행됩니다. 쿼리 (MySQL은 / ​​포스트 그레스 또는 LIMIT) TOP을 사용하지 않을 경우 최종 결과 집합없는 행을 주문 아무런 혜택이 없습니다.

    치다:

    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
    

    이 나쁜 때문입니다 :

  4. ==============================

    4.ORDER BY 절에는 ORDER이없는 경우, TOP 100 PERCENT가 중복됩니다. (당신이 언급대로, 이것은 전망과 함께 '트릭'이었다)

    ORDER BY 절에는 ORDER이없는 경우, TOP 100 PERCENT가 중복됩니다. (당신이 언급대로, 이것은 전망과 함께 '트릭'이었다)

    [바라기는 최적화 멀리이 최적화된다.]

  5. ==============================

    5.그 이유는 간단하다 : 엔터프라이즈 관리자가 도움이 될하려고 당신을 위해 이것을 포함하도록 코드를 포맷하는 데 사용됩니다. 어떤 점은 정말 아무것도 다치게하지 않았다 당신이 그것을 변경했다 다음 번에 EM 다시 삽입하는 것처럼 이제까지 그것을 제거하려고 없었다.

    그 이유는 간단하다 : 엔터프라이즈 관리자가 도움이 될하려고 당신을 위해 이것을 포함하도록 코드를 포맷하는 데 사용됩니다. 어떤 점은 정말 아무것도 다치게하지 않았다 당신이 그것을 변경했다 다음 번에 EM 다시 삽입하는 것처럼 이제까지 그것을 제거하려고 없었다.

  6. ==============================

    6.이유하지만, 무관심, 나는 생각하지 것입니다.

    이유하지만, 무관심, 나는 생각하지 것입니다.

    이러한 쿼리 문자열은 일반적으로 그래픽 쿼리 도구에 의해 생성됩니다. 사용자는 몇 개의 테이블을 조인 필터, 정렬 순서를 추가하고, 그 결과를 테스트합니다. 사용자가보기로 쿼리를 저장할 수 있기 때문에,이 도구는 TOP 100 PERCENT를 추가합니다. 이 경우에는, 그러나, 사용자의 사본 자신의 코드에 SQL은 데이터 액세스 계층에서 WHERE 절 및 가죽 모든 파라미터. 마음에서, 보이지 않는.

  7. ==============================

    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. ==============================

    8.나는 당신이보기에 조각하여 주문을 받고 제외하고 그 결과에 변수를 사용할 수 있지만한다고 가정 것입니다, 당신은 암시 적으로 "TOP 100 PERCENT"을 주장하여 혜택을 볼 수 없습니다 :

    나는 당신이보기에 조각하여 주문을 받고 제외하고 그 결과에 변수를 사용할 수 있지만한다고 가정 것입니다, 당신은 암시 적으로 "TOP 100 PERCENT"을 주장하여 혜택을 볼 수 없습니다 :

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

    9.그냥 거의 자체를 설명하고,이 시도. 다음과 같은 경우를 제외하고에 의해 순서가있는 뷰를 만들 수 없습니다 ...

    그냥 거의 자체를 설명하고,이 시도. 다음과 같은 경우를 제외하고에 의해 순서가있는 뷰를 만들 수 없습니다 ...

    CREATE VIEW v_Test
             AS
               SELECT name
                 FROM sysobjects
             ORDER BY name
            GO
    
  10. ==============================

    10.오류가 모든 것을 말해 ...

    오류가 모든 것을 말해 ...

    N이 숫자 TOP 100 PERCENT를 사용 TOP n을 사용하지 마십시오

    상위 100 PERCENT는 (이유 나도 몰라) SQL 서버 VIEW (포스트 2012 버전)에 의해 무시하지만 MS는 구문 이유로 그것을 계속 생각된다. TOP N은 더 나은 및 뷰 내부에서 작업하고 그것을보기는 처음 사용할 때 당신이 원하는 방식으로 정렬하지만 조심합니다.

  11. from https://stackoverflow.com/questions/1622878/why-use-select-top-100-percent by cc-by-sa and MIT license