가능한 설명에서 예기치 않은 속도 저하는 SQL 서버 2014 엔터프라이즈 에디션 (64 비트)에서 여기 in the commentSQL Server 쿼리 최적화 - 간단한 쿼리
입니다 - 내가보기에서 읽으려고하고있다. 표준 쿼리에는 이와 같이 ORDER BY
및 OFFSET-FETCH
절만 포함됩니다. 동일한 결과를 반환 다음 쿼리보다 (150K 같은 행 다수 스킵 할 때 눈에 띄는) 1
SELECT
*
FROM Metadata
ORDER BY
AgeInHours ASC,
RankingPoint DESC,
PublishDate DESC
OFFSET 150000 ROWS
FETCH NEXT 40 ROWS ONLY
접근법 그러나 이러한 비교적 간단한 쿼리 거의 9 배 느리게 행한다. I는 판독하고이 경우
주 사용 후 첫번째 키와 해당 WHERE...IN
함수에 대한 파라미터로서
접근법 2
SELECT
*
FROM Metadata
WHERE NewsId IN (
SELECT
NewsId
FROM Metadata
ORDER BY
AgeInHours ASC,
RankingPoint DESC,
PublishDate DESC
OFFSET 150000 ROWS
FETCH NEXT 40 ROWS ONLY
)
ORDER BY
AgeInHours ASC,
RankingPoint DESC,
PublishDate DESC
벤치마킹 차이
두 쇼(40 row(s) affected)
SQL Server Execution Times:
CPU time = 14748 ms, elapsed time = 3329 ms.
(40 row(s) affected)
SQL Server Execution Times:
CPU time = 3828 ms, elapsed time = 469 ms.
기본 키에 대한 색인이 PubilshDate
이고 그 fragmentat가 있습니다. 이온이 매우 낮습니다. 또한 데이터베이스 테이블에 대해 유사한 쿼리를 실행하려고 시도했지만 모든 경우에 두 번째 방법은 성능이 크게 향상되었습니다. SQL Server 2012에서도이 기능을 테스트했습니다.
어떤 일이 벌어지고 있는지 설명 할 수 있습니까?
스키마
접근 1 : 실행 계획
접근법 2 : 실행 계획 (왼쪽 부분)
접근법 2 : 실행 계획 (오른쪽 부분)
첫 번째 접근 방식을 실행하고 ** ** ID' 열만 선택하면 어떻게됩니까? 나는'*'별표가 전체 컬럼을 스캔하도록 강제하기 때문에 별표가 쿼리 속도를 늦춘 것으로 의심된다. – sagi
인덱싱 된 열 ('Id') 만 찾는 것보다 훨씬 빠릅니다 (거의 9 번 말합니다). 수수께끼 같은 점은 두 번째 쿼리에서'WHERE-IN' 절을 사용할 때 여전히 같은 양의 데이터를 읽는 중입니다.하지만 시간이 걸리지는 않습니다. 현장 뒤에 무슨 일이 일어나고있는거야? – undefined
쿼리 계획과 테이블 스키마를 포함 할 수 있습니까? –