카테고리 없음

[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