Tôi có một bảng với hàng 20M, và mỗi hàng có 3 cột: time
, id
, và value
. Đối với mỗi id
và time
, có một value
trạng thái. Tôi muốn biết giá trị chì và độ trễ của một giá trị time
cụ thể id
.
Tôi đã sử dụng hai phương pháp để đạt được điều này. Một phương thức đang sử dụng phép nối và một phương thức khác là sử dụng các hàm cửa sổ dẫn / trễ với chỉ số được nhóm time
và bật id
.
Tôi đã so sánh hiệu suất của hai phương thức này theo thời gian thực hiện. Phương thức nối mất 16,3 giây và phương thức chức năng cửa sổ mất 20 giây, không bao gồm thời gian để tạo chỉ mục. Điều này làm tôi ngạc nhiên vì chức năng cửa sổ dường như được nâng cao trong khi các phương thức nối là lực lượng vũ phu.
Đây là mã cho hai phương thức:
Tạo chỉ mục
create clustered index id_time
on tab1 (id,time)
Tham gia phương pháp
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
Thống kê IO được tạo bằng SET STATISTICS TIME, IO ON
:
Đây là kế hoạch thực hiện cho phương thức nối
Phương pháp chức năng cửa sổ
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
(Chỉ đặt hàng bằng cách time
tiết kiệm 0,5 giây.)
Dưới đây là kế hoạch thực hiện cho phương thức chức năng Window
Thống kê IO
[
Tôi đã kiểm tra dữ liệu sample_orig_month_1999
và có vẻ như dữ liệu thô được sắp xếp tốt bởi id
và time
. Đây có phải là lý do của sự khác biệt hiệu suất?
Có vẻ như phương thức nối có số lần đọc logic hơn phương thức hàm cửa sổ, trong khi thời gian thực hiện cho cái trước thực sự ít hơn. Có phải bởi vì trước đây có một song song tốt hơn?
Tôi thích phương pháp chức năng cửa sổ vì mã ngắn gọn, có cách nào để tăng tốc cho vấn đề cụ thể này không?
Tôi đang sử dụng SQL Server 2016 trên Windows 10 64 bit.