Một cách hiệu quả để so sánh hai tập dữ liệu lớn trong SQL


12

Hiện tại, tôi đang so sánh hai bộ dữ liệu có chứa các StoreKey/ProductKeykết hợp duy nhất .

Tập dữ liệu đầu tiên có các StoreKey/ProductKeykết hợp duy nhất cho doanh số từ đầu tháng 1 năm 2012 đến cuối tháng 5 năm 2014 (kết quả = 450K dòng). Tập dữ liệu thứ 2 có các StoreKey/ProductKeykết hợp duy nhất , để bán bắt đầu từ tháng 6 năm 2014, cho đến ngày hôm nay (kết quả = 190K dòng).

Tôi đang tìm kiếm các StoreKey/ProductKeykết hợp trong tập 2, nhưng không phải trong tập 1 - tức là các sản phẩm mới được bán từ đầu tháng Sáu.

Cho đến bây giờ, tôi đã đổ hai bộ dữ liệu vào các bảng tạm thời, tạo các chỉ mục cho cả hai bảng trên cả hai khóa và sử dụng EXCEPTcâu lệnh để tìm các mục duy nhất.

Cách hiệu quả nhất để so sánh các tập dữ liệu lớn như vậy là gì? Có cách nào hiệu quả hơn để làm loại so sánh lớn này không?

Câu trả lời:


10

Theo tôi, sử dụng EXCEPT là cách để đi đến đây, nhưng bạn có thể muốn xem xét lại việc sử dụng bảng tạm thời. Bằng cách làm như vậy, bạn đang sao chép hiệu quả dữ liệu của mình trong bộ nhớ, điều này sẽ làm bạn chậm lại. Nếu các chỉ mục bạn cần tồn tại trên các bảng nguồn (như tôi nghi ngờ), chỉ cần so sánh các CHỌN thích hợp:

SELECT StoreKey,ProductKey FROM table WHERE sales BETWEEN date1 AND date2
EXCEPT
SELECT StoreKey,ProductKey FROM table WHERE sales BETWEEN date3 AND date4

1
Đúng, bảng này có các chỉ mục, nhưng đó là một chỉ mục được nhóm trên hai trường bắt buộc, cộng với một trường có tên là TransactionDateKey. Sẽ có sự khác biệt lớn nếu tôi triển khai: a.) Một chỉ mục được nhóm trên StoreKey và ProductKey b.) Hai chỉ mục không phân cụm riêng biệt trên StoreKey và ProductKey tương ứng?
Pierre Pretorius

1
Tôi giả sử TransactionDateKeylà cột được sử dụng để lọc khoảng thời gian. Trong trường hợp đó, chỉ số cụm trên TransactionDateKey, StoreKeyProductKeylà hoàn hảo.
Twinkles

1

Nếu bạn quen thuộc với các thuật toán (độ phức tạp Big-O), thực hiện so sánh này là tốt nhất ở O (n log (n)). Thuật toán hiệu quả nhất sẽ sắp xếp cả hai tập dữ liệu, sau đó thực hiện song song chạy chúng xuống để tìm các khóa khớp (hoặc chưa từng có). Hầu hết các trình tối ưu hóa RDBMS sẽ tự động làm điều này cho bạn khi bạn đang sử dụng EXCEPThoặc MINUS. Kế hoạch giải thích của bạn sẽ xác nhận hoặc không xác nhận. Nếu bạn thấy các vòng lặp lồng nhau, bạn đang thực hiện O (n ^ 2), không hiệu quả.


Cảm ơn Josua. Không quen thuộc với sự phức tạp của Big-O, nhưng chắc chắn sẽ có một cái nhìn về nó.
Pierre Pretorius

Liên kết để tìm hiểu thêm về Phân tích độ phức tạp, mà một số người gọi chung là Big-O. Nó không khó như lúc đầu. Khi mọi người nói rằng một nhiệm vụ sẽ chạy trong thời gian tuyến tính hoặc thời gian đa thức, đây là những gì họ đang đề cập đến. Sao lưu cơ sở dữ liệu nói chung là tuyến tính, có nghĩa là kích thước cơ sở dữ liệu 2x mất 2 lần thời gian để sao lưu. Sắp xếp một dữ liệu đặt nó không tuyến tính mặc dù. Một tệp lớn gấp 2 lần mất hơn 2 lần thời gian để sắp xếp. bigochcoateet.com , Trong wiki en.wikipedia.org/wiki/Time_complexity, nó đề cập đến loại sắp xếp so sánh nhanh nhất có thể là "linearithmic time" = n log (n).
Joshua Huber
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.