다음 스크립트를 복사 해 붙여 넣으십시오.하위 쿼리 만들기 쿼리가 느림
DECLARE @MainTable TABLE(MainTablePkId int)
INSERT INTO @MainTable SELECT 1
INSERT INTO @MainTable SELECT 2
DECLARE @SomeTable TABLE(SomeIdPk int, MainTablePkId int, ViewedTime1 datetime)
INSERT INTO @SomeTable SELECT 1, 1, DATEADD(dd, -10, getdate())
INSERT INTO @SomeTable SELECT 2, 1, DATEADD(dd, -9, getdate())
INSERT INTO @SomeTable SELECT 3, 2, DATEADD(dd, -6, getdate())
DECLARE @SomeTableDetail TABLE(DetailIdPk int, SomeIdPk int, Viewed INT, ViewedTimeDetail datetime)
INSERT INTO @SomeTableDetail SELECT 1, 1, 1, DATEADD(dd, -7, getdate())
INSERT INTO @SomeTableDetail SELECT 2, 2, NULL, DATEADD(dd, -6, getdate())
INSERT INTO @SomeTableDetail SELECT 3, 2, 2, DATEADD(dd, -8, getdate())
INSERT INTO @SomeTableDetail SELECT 4, 3, 1, DATEADD(dd, -6, getdate())
SELECT m.MainTablePkId,
(SELECT COUNT(Viewed) FROM @SomeTableDetail),
(SELECT TOP 1 s2.ViewedTimeDetail FROM @SomeTableDetail s2
INNER JOIN @SomeTable s1 ON s2.SomeIdPk = s1.SomeIdPk
WHERE s1.MainTablePkId = m.MainTablePkId)
FROM @MainTable m
이 스크립트는 예제 일뿐입니다. 서브 쿼리에서 열의 길이가 긴 목록이 SELECT
이고 약 12 개 이상의 열이 있습니다. 내 From
절에는 약 8 개의 테이블이 있습니다.
전체 레코드를 가져 오려면 21 초가 걸리고 하위 쿼리를 제거하면 4 초가 걸립니다.
'데이터베이스 엔진 튜닝 관리자'를 사용하여 쿼리를 최적화하고 새로운 권장 인덱스 및 통계를 추가하려고했지만 이러한 변경으로 인해 쿼리 시간이 훨씬 나 빠졌다.
참고 :이 테스트 데이터는 내 질문에 설명하는 것입니다 언급 한 것처럼
실제 데이터 테이블의 많은 열을 조인하지만 미세 하위 쿼리 결과 우리를하지 않고있다.
도움 주시면 감사하겠습니다.
SELECT COUNT (보기)부터 @SomeTableDetail이 @SomeTable 테이블의 ID와 연결되어야합니까? – Lamak
'TOP 1'을'ORDER BY '하지 않고 임의의 행을 얻을 수 있음을 의미합니다. 또한,'COUNT()'부질의는 @MainTable과 상호 관련이 있는가? –
두 번째 하위 쿼리에서 ORDER BY없이 TOP를 사용하고 있습니다. 어떤 ViewedTimeDetail이 정말로 반환되기를 원합니까? 가장 일찍? 최신? –