ผมมีตารางที่มีแถว 20M และแต่ละแถวมี 3 คอลัมน์: time
, และid
value
สำหรับแต่ละid
และtime
มีvalue
สถานะ ฉันต้องการทราบว่านำและล่าช้าค่าของบางอย่างสำหรับการที่เฉพาะเจาะจงtime
id
ฉันใช้สองวิธีเพื่อให้ได้สิ่งนี้ วิธีการหนึ่งคือการใช้เข้าร่วมและอีกวิธีหนึ่งคือการใช้ฟังก์ชั่นหน้าต่างนำ / ล่าช้ากับดัชนีคลัสเตอร์บนและtime
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
:
นี่คือแผนการดำเนินการสำหรับวิธีการเข้าร่วม
วิธีการฟังก์ชั่นหน้าต่าง
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 วินาที)
นี่คือแผนการดำเนินการสำหรับวิธีการทำงานของหน้าต่าง
สถิติ IO
[
ฉันจะตรวจสอบข้อมูลในsample_orig_month_1999
และดูเหมือนว่าข้อมูลดิบได้รับคำสั่งอย่างดีจากและid
time
นี่เป็นสาเหตุของความแตกต่างด้านประสิทธิภาพหรือไม่
ดูเหมือนว่าวิธีการรวมมีการอ่านแบบลอจิคัลมากกว่าวิธีฟังก์ชั่นหน้าต่างในขณะที่เวลาดำเนินการสำหรับอดีตนั้นน้อยกว่าจริง เป็นเพราะอดีตมีความเท่าเทียมที่ดีกว่า
ฉันชอบวิธีฟังก์ชั่นหน้าต่างเนื่องจากรหัสย่อมีวิธีใดที่จะเร่งความเร็วสำหรับปัญหาเฉพาะนี้หรือไม่
ฉันใช้ SQL Server 2016 บน Windows 10 64 บิต