카테고리 없음
[SQL] SQL Server : 예상 행 수를 벗어났습니다.
행복을전해요
2021. 1. 6. 14:30
저는 SQL Server의 내부 작업 / 쿼리 최적화 프로세스에 대한 전문가는 아니지만 여기에 2 펜스 (또는 원하는 경우 센트)가 있습니다.
WHERE 절 내에서 ROW_NUMBER () 값을 사용했기 때문이라고 생각합니다. 예를 들어, 말씀하신대로 ID 1부터 1000까지 (기본 키로서의 ID) 1000 개의 행으로 채워진 샘플 테이블을 만들었습니다.
ROW_NUMBER ()를 꺼내고 다음과 같이 ID 열을 기반으로 쿼리를 수행하면 :
Select * FROM
(
SELECT ID, Name
FROM Log
)
as LogWithRowNumbers
WHERE ID>=1 and ID<=2
그런 다음 실제로 예상대로 행 수가 2로 올바르게 표시됩니다.
이제 거꾸로 작업하여 내부 SELECT에 ROW_NUMBER를 추가하되 WHERE 절은 그대로 둡니다.
Select * FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY ID DESC) AS RowNo,
ID, Name
FROM Log
)
as LogWithRowNumbers
WHERE ID>=1 AND ID <=2
여전히 올바른 행 수가 2로 표시됩니다.
마지막으로, ID 대신 필터링되는 열로 RowNo를 사용하도록 WHERE 절을 다시 설정합니다. 이때 예상 행 수가 9로 점프합니다.
따라서 원인 인 WHERE 절에서 필터링되는 ROW_NUMBER () 함수의 사용이라고 생각합니다. 따라서이 함수 생성 값보다 실제 테이블 열에서 사용할 수있는 더 나은 / 더 정확한 통계가 있기 때문이라고 생각합니다.
나는 이것이 적어도 좋은 출발점을 제공하기를 바랍니다.
-------------------AdaTheDev가 정확합니다. 이 동작이 나타나는 이유는 SQL Server가 where 절에서 사용하기 전에 테이블의 행 번호를 계산해야하기 때문입니다.
이것은 동일한 결과를 얻는보다 효율적인 방법이어야합니다.
SELECT TOP(2) ROW_NUMBER() OVER (ORDER BY ID DESC) as Row,
ID, Name
FROM Log
ORDER BY ID DESC
출처
https://stackoverflow.com/questions/2005834