programing

ROW_NUMBER 주문자 없음

fastcode 2023. 4. 20. 22:58
반응형

ROW_NUMBER 주문자 없음

Redis에 추가된 데이터 양을 추적할 수 있도록 기존 쿼리에 행 번호를 추가해야 합니다.쿼리가 실패하면 다른 테이블에서 업데이트되는 해당 행 번호부터 시작할 수 있습니다.

테이블에서 1000행 이후 데이터 시작을 위한 쿼리

SELECT * FROM (SELECT *, ROW_NUMBER() OVER (Order by (select 1)) as rn ) as X where rn > 1000

쿼리는 정상적으로 동작하고 있습니다.주문을 사용하지 않고 행을 얻을 수 있는 방법이 있다면.

뭐가select 1여기?

쿼리가 최적화되어 있는지 아니면 다른 방법으로 할 수 있는지.더 나은 해결책을 제시해 주세요.

에서 상수를 지정하는 것에 대해서는 걱정할 필요가 없습니다.ORDER BY표현.다음은 Microsoft SQL Server 2012 High-Performance T-SQL Using Window Functions에서 인용한 것입니다.Itzik Ben-Gan(Microsoft 무료 전자책 사이트에서 무료로 다운로드 가능):

앞서 설명한 바와 같이 윈도 오더구는 필수이며 SQL Server에서는 ORDER BY NULL과 같은 상수를 기반으로 순서를 지정할 수 없습니다.그러나 놀랍게도 ORDER BY(SELECT NULL)와 같이 상수를 반환하는 서브쿼리에 기반한 식을 전달할 때SQL Server가 수락합니다.동시에 최적기는 식을 네스트 해제하거나 확장하여 모든 행의 순서가 동일함을 인식합니다.따라서 입력 데이터에서 주문 요구 사항을 제거합니다.다음은 이 기술을 설명하는 전체 질문입니다.

SELECT actid, tranid, val,
 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum
FROM dbo.Transactions;

여기에 이미지 설명 입력

Index Scan 반복기의 속성에서 Ordered 속성이 False임을 확인합니다. 즉, 반복기는 데이터를 인덱스 키 순서로 반환할 필요가 없습니다.


위의 내용은 일정한 순서를 사용하지 않음을 의미합니다.나는 이 책을 읽기를 강력히 추천한다.Itzik Ben-Gan에 윈도 기능의 기능 및 사용 시 다양한 케이스를 최적화하는 방법에 대해 자세히 설명합니다.

그냥 해 봐order by 1에러 메시지를 확인합니다.그런 다음 를 복구합니다.order by (select 1)이 글을 쓴 사람이 누구든 어느 시점에서 오류 메시지를 읽고 올바른 방법은 오류가 경고하려고 했던 근본적인 진실을 깨닫는 것이 아니라 시스템을 속여서 오류를 발생시키지 않도록 하는 것이라고 판단했다는 것을 깨달으십시오.

테이블에는 고유의 순서가 없습니다.신뢰할 수 있는 주문 형태를 원하는 경우, 모든 항목에 충분한 결정론적 표현을 제공하는 것은 사용자에게 달려 있습니다.ORDER BY각 행이 고유하게 식별되고 순서가 지정되도록 절을 지정합니다.

또, 에러를 발생시키지 않게 시스템을 속이는 것 등, 시스템은, 고객에게 제공된 툴을 사용하지 않고, 합리적인 조작을 실시할 수 있기를 바라고 있습니다.즉, 적절한 사양이 필요합니다.ORDER BY절을 클릭합니다.

임의의 리터럴 값을 사용할 수 있습니다.

ex

order by (select 0)

order by (select null)

order by (select 'test')

기타

상세한 것에 대하여는, https://exploresql.com/2017/03/31/row_number-function-with-no-specific-order/ 를 참조해 주세요.

여기서 1번 선택지가 뭐죠?

이 시나리오에서 쿼리 작성자는 특별한 정렬을 염두에 두고 있지 않습니다. ROW_NUMBER에는 「」가 필요합니다.ORDER BY clause파서를 만족시킬 수 있는 방법이 될 수 있습니다.

"상수"에 따라 정렬하면 "확정되지 않은" 순서가 생성됩니다(쿼리 옵티마이저는 적합한 순서를 선택할 수 있습니다).

가장 쉬운 방법은 다음과 같습니다.

ROW_NUMBER() OVER(ORDER BY 1)    -- error
ROW_NUMBER() OVER(ORDER BY NULL) -- error

"꼼수" 쿼리 최적화 도구에 일정한 표현을 제공할 수 있는 시나리오는 다음과 같습니다.

ROW_NUMBER() OVER(ORDER BY (SELECT 1)) -- already presented

기타 옵션:

ROW_NUMBER() OVER(ORDER BY 1/0)       -- should not be used
ROW_NUMBER() OVER(ORDER BY @@SPID)
ROW_NUMBER() OVER(ORDER BY DB_ID())
ROW_NUMBER() OVER(ORDER BY USER_ID())

db <> 데모 표시

언급URL : https://stackoverflow.com/questions/44105691/row-number-without-order-by

반응형