나는 20M 행이있는 테이블이 있고, 각 행 3 열이 있습니다 time
, id
하고 value
. 각각의 경우 id
와 time
하는 존재 value
상태에 대한. 특정 time
에 대한 특정 리드 및 지연 값을 알고 싶습니다 id
.
이것을 달성하기 위해 두 가지 방법을 사용했습니다. 한 가지 방법은 join을 사용하고 다른 방법은 clustered index on time
및 창 함수 lead / lag를 사용하는 것 id
입니다.
이 두 방법의 성능을 실행 시간별로 비교했습니다. 조인 방법은 16.3 초가 걸리고 윈도우 함수 방법은 20 초가 걸리며 인덱스 생성 시간은 포함되지 않습니다. 조인 방법이 무차별 적 인 동안 창 기능이 향상 된 것처럼 보였으므로 놀랐습니다.
다음은 두 가지 방법에 대한 코드입니다.
인덱스 생성
create clustered index id_time
on tab1 (id,time)
가입 방법
select a1.id,a1.time
a1.value as value,
b1.value as value_lag,
c1.value as value_lead
into tab2
from tab1 a1
left join tab1 b1
on a1.id = b1.id
and a1.time-1= b1.time
left join tab1 c1
on a1.id = c1.id
and a1.time+1 = c1.time
다음을 사용하여 생성 된 IO 통계 SET STATISTICS TIME, IO ON
:
join 메소드 의 실행 계획은 다음과 같습니다.
창 기능 방법
select id, time, value,
lag(value,1) over(partition by id order by id,time) as value_lag,
lead(value,1) over(partition by id order by id,time) as value_lead
into tab2
from tab1
(주문 만 time
0.5 초 절약)
Window 함수 방식 의 실행 계획은 다음과 같습니다.
IO 통계
[
나는 데이터를 체크인했으며 sample_orig_month_1999
원시 데이터는 id
및에 의해 잘 정렬 된 것으로 보입니다 time
. 이것이 성능 차이의 이유입니까?
join 메소드는 window 함수 메소드보다 더 많은 논리적 읽기를 가지고있는 반면, 전자의 실행 시간은 실제로는 적습니다. 전자가 더 나은 병렬 처리를 갖기 때문입니까?
간결한 코드로 인해 윈도우 함수 방법이 마음에 듭니다.이 특정 문제에 대해 속도를 높일 수있는 방법이 있습니까?
Windows 10 64 비트에서 SQL Server 2016을 사용하고 있습니다.