상위 100% 선택을 사용하는 이유는 무엇입니까?
SQL Server 2005 이전에는 SQL Server를 "꼼수"하여 보기 정의에서 다음을 포함하여 주문을 사용할 수 있었습니다.TOP 100 PERCENT
SELECT 절에 있습니다.하지만 나는 내가 물려받은 다른 코드를 보았다 그것은SELECT TOP 100 PERCENT
동적 SQL 문(ASP의 ADO에 사용됨) 내에서 사용됩니다.NET 앱 등).무슨 이유라도 있습니까?그 결과는 포함하지 않는 것과 같지 않습니까?TOP 100 PERCENT
?
"중간 구체화(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...
TOP (100) PERCENCY는 SQL Server의 최신 버전에서는 전혀 의미가 없으며, 조회 프로세서에서 해당 ORDER BY와 함께(뷰 정의 또는 파생 테이블의 경우) 무시합니다.
옛날에는 속임수로 사용될 수도 있었지만, 그래도 믿을 수는 없었습니다.안타깝게도, 마이크로소프트의 그래픽 도구 중 일부는 이 무의미한 조항을 삽입했습니다.
동적 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
이는 다음과 같은 이유로 좋지 않습니다.
- 이 예에서는 처음에 항목 설명을 기준으로 목록을 정렬한 다음 항목 유형 설명을 기준으로 정렬합니다.첫 번째 정렬에서 리소스가 낭비됩니다. 현재 상태로 실행된다고 해서 실행되는 것은 아닙니다.
ORDER BY item_type_description, item_description
- 캡슐화로 인해 뷰가 무엇을 기준으로 정렬되는지는 명확하지 않습니다.이것은 서로 다른 정렬 순서로 여러 뷰를 만들어야 한다는 것을 의미하지 않습니다.
없는 ORDER BY
그 다음에 그, 면다렇절.TOP 100 PERCENT
중복됩니다. (당신이 언급했듯이, 이것은 뷰가 있는 '꼼수'였습니다.)
[옵티마이저가 이를 최적화하기를 바랍니다.]
SELECT TOP 100%를 사용하는 상속된 다른 코드를 보았습니다.
그 이유는 간단합니다. Enterprise Manager는 유용한 기능을 제공하고 코드를 포맷하여 이 기능을 사용자에게 제공합니다.그것은 실제로 아무 상처도 주지 않았고 다음에 그것을 바꾸러 갈 때 EM이 그것을 다시 삽입할 것이기 때문에 그것을 제거하려고 시도하는 것은 의미가 없었습니다.
이유는 없지만 무관심한 것 같아요.
이러한 쿼리 문자열은 일반적으로 그래픽 쿼리 도구에 의해 생성됩니다.사용자는 몇 개의 테이블에 가입하고 필터를 추가한 다음 정렬 순서를 추가하고 결과를 테스트합니다.사용자가 쿼리를 보기로 저장하려고 할 수 있으므로 도구는 상위 100%를 추가합니다. 그러나 이 경우 사용자는 SQL을 자신의 코드로 복사하고 WHERE 절을 매개 변수화한 다음 데이터 액세스 계층에 모든 항목을 숨깁니다.마음에서 멀어지면 눈에서 멀어집니다.
아래를 시도해 보십시오. 당신에게 도움이 되기를 바랍니다.
SELECT TOP
( SELECT COUNT(foo)
From MyTable
WHERE ISNUMERIC (foo) = 1) *
FROM bar WITH(NOLOCK)
ORDER BY foo
WHERE CAST(foo AS int) > 100
)
오류가 모든 것을 말해줍니다...
Msg 1033, Level 15, State 1, Procedure TestView, Line 5 TOP, OFFSET 또는 FOR XML이 지정되지 않은 경우 ORDER BY 절은 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블 식에서 유효하지 않습니다.
사용하지 TOP 100 PERCENT
,사용하다TOP n
여기서 N은 숫자입니다.
TOP 100 PERCENCE (제가 모르는 이유로)는 SQL Server VIEW (2012년 이후 버전)에서 무시되지만, MS는 구문상의 이유로 유지한 것 같습니다.TOPn이 더 낫고 뷰 내부에서 작동하며 뷰를 처음 사용할 때 원하는 방식으로 정렬하지만 주의해야 합니다.
결과에 변수를 사용할 수 있지만 뷰에서 조각별로 주문을 받는 것 외에는 "TOP 100%"라고 암시적으로 말하는 것만으로는 이점을 볼 수 없습니다.
declare @t int
set @t=100
select top (@t) percent * from tableOf
그냥 이것을 시도해 보세요, 그것은 그것 자체를 거의 설명합니다.다음 경우를 제외하고 주문 기준으로 뷰를 작성할 수 없습니다.
CREATE VIEW v_Test
AS
SELECT name
FROM sysobjects
ORDER BY name
GO
Msg 1033, Level 15, State 1, Procedure TestView, Line 5 TOP, OFFSET 또는 FOR XML이 지정되지 않은 경우 ORDER BY 절은 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블 식에서 유효하지 않습니다.
언급URL : https://stackoverflow.com/questions/1622878/why-use-select-top-100-percent
'programing' 카테고리의 다른 글
목표-C에서 시간 경과 (0) | 2023.05.05 |
---|---|
OrderedDict는 Python 3.7에서 중복됩니까? (0) | 2023.05.05 |
파이썬의 for 루프에서 "통과"와 "계속" 사이에 차이가 있습니까? (0) | 2023.05.05 |
웹 구성 변환이 작동하지 않습니다. (0) | 2023.05.05 |
Xcode DMG 또는 XIP 파일을 다운로드하는 방법은 무엇입니까? (0) | 2023.05.05 |