Aku punya tabel dengan baris 20m, dan setiap baris memiliki 3 kolom: time
, id
, dan value
. Untuk masing id
- masing dan time
, ada value
untuk status. Saya ingin tahu nilai lead dan lag dari time
yang spesifik untuk yang spesifik id
.
Saya telah menggunakan dua metode untuk mencapai ini. Salah satu metode menggunakan join dan metode lain menggunakan fungsi jendela lead / lag dengan indeks berkerumun di time
dan id
.
Saya membandingkan kinerja kedua metode ini dengan waktu eksekusi. Metode bergabung membutuhkan 16,3 detik dan metode fungsi jendela membutuhkan 20 detik, tidak termasuk waktu untuk membuat indeks. Ini mengejutkan saya karena fungsi jendela tampaknya maju sementara metode join adalah brute force.
Berikut adalah kode untuk dua metode:
Buat Indeks
create clustered index id_time
on tab1 (id,time)
Bergabunglah dengan metode
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
Statistik IO dihasilkan dengan menggunakan SET STATISTICS TIME, IO ON
:
Berikut adalah rencana eksekusi untuk metode bergabung
Metode Fungsi Jendela
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
(Memesan hanya dengan time
menghemat 0,5 detik.)
Berikut ini adalah rencana eksekusi untuk metode fungsi Window
Statistik IO
[
Saya memeriksa data sample_orig_month_1999
dan sepertinya data mentah dipesan dengan baik oleh id
dan time
. Apakah ini alasan perbedaan kinerja?
Tampaknya metode gabungan memiliki lebih banyak bacaan logis daripada metode fungsi jendela, sedangkan waktu eksekusi untuk yang sebelumnya sebenarnya kurang. Apakah karena mantan memiliki paralelisme yang lebih baik?
Saya suka metode fungsi jendela karena kode ringkas, apakah ada cara untuk mempercepatnya untuk masalah khusus ini?
Saya menggunakan SQL Server 2016 pada Windows 10 64 bit.