วิธีที่มีประสิทธิภาพในการเปรียบเทียบชุดข้อมูลขนาดใหญ่สองชุดใน SQL


12

ขณะนี้ฉันกำลังเปรียบเทียบชุดข้อมูลสองชุดที่มีStoreKey/ProductKeyชุดค่าผสมที่ไม่ซ้ำกัน

ชุดข้อมูลชุดที่ 1 มีชุดค่าStoreKey/ProductKeyผสมที่ไม่ซ้ำกันสำหรับการขายระหว่างเริ่มมกราคม 2012 และสิ้นสุดพฤษภาคม 2014 (ผลลัพธ์ = 450K บรรทัด) ชุดข้อมูลที่ 2 มีชุดค่าStoreKey/ProductKeyผสมที่ไม่ซ้ำกันสำหรับการขายเริ่มต้นมิถุนายน 2014 จนถึงวันนี้ (ผลลัพธ์ = 190K บรรทัด)

ฉันกำลังมองหาStoreKey/ProductKeyชุดค่าผสมที่อยู่ในชุดที่ 2 แต่ไม่ใช่ในชุดที่ 1 - คือผลิตภัณฑ์ใหม่ที่ขายตั้งแต่ต้นเดือนมิถุนายน

จนถึงตอนนี้ฉันได้ทิ้งชุดข้อมูลสองชุดลงในตารางชั่วคราวสร้างดัชนีสำหรับทั้งสองตารางบนทั้งสองปุ่มแล้วใช้EXCEPTคำสั่งเพื่อค้นหารายการที่ไม่ซ้ำกัน

วิธีที่มีประสิทธิภาพที่สุดในการเปรียบเทียบชุดข้อมูลขนาดใหญ่ดังกล่าวคืออะไร มีวิธีที่มีประสิทธิภาพมากกว่าในการทำการเปรียบเทียบขนาดใหญ่ประเภทนี้หรือไม่

คำตอบ:


10

การใช้งาน EXCEPT นั้นเป็นความคิดของฉันในการไปที่นี่ แต่คุณอาจต้องการพิจารณาการใช้ตารางชั่วคราวอีกครั้ง ด้วยการทำเช่นนี้คุณกำลังทำซ้ำข้อมูลของคุณในหน่วยความจำอย่างมีประสิทธิภาพซึ่งจะทำให้คุณช้าลง หากดัชนีที่คุณต้องการมีอยู่ในตารางแหล่งที่มา (ตามที่ฉันสงสัย) เพียงแค่เปรียบเทียบ SELECTS ที่เหมาะสม:

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

1
ถูกต้องตารางจะมีดัชนี แต่เป็นดัชนีแบบคลัสเตอร์ในสองฟิลด์ที่ต้องการพร้อมกับฟิลด์ชื่อ TransactionDateKey จะเห็นความแตกต่างใหญ่หรือไม่หากฉันใช้งานอย่างใดอย่างหนึ่ง: a.) ดัชนีคลัสเตอร์ใน StoreKey และ ProductKey b.) ดัชนีที่ไม่ได้ทำคลัสเตอร์แยกกันสองรายการบน StoreKey และ ProductKey ตามลำดับ
Pierre Pretorius

1
ฉันถือว่าTransactionDateKeyเป็นคอลัมน์ที่ใช้ในการกรองช่วงเวลา ในกรณีที่ดัชนีคลัสเตอร์บนTransactionDateKey, StoreKeyและProductKeyเป็นที่สมบูรณ์แบบ
Twinkle

1

หากคุณคุ้นเคยกับอัลกอริทึม (ความซับซ้อนของ Big-O) การทำการเปรียบเทียบนี้จะดีที่สุด O (n log (n)) อัลกอริทึมที่มีประสิทธิภาพที่สุดจะเรียงลำดับชุดข้อมูลทั้งสองจากนั้นทำการผสานการทำงานแบบขนานเพื่อค้นหาคีย์ที่ตรงกัน (หรือไม่ตรงกัน) ส่วนใหญ่เพิ่มประสิทธิภาพ RDBMS จะทำเช่นนี้สำหรับคุณโดยอัตโนมัติเมื่อคุณกำลังใช้หรือEXCEPT MINUSแผนการอธิบายของคุณจะยืนยันหรือไม่ยืนยัน หากคุณเห็นลูปซ้อนกันแสดงว่าคุณกำลังทำ O (n ^ 2) ไม่ใช่ประสิทธิภาพ


ขอบคุณโจซัว ไม่คุ้นเคยกับความซับซ้อนของ Big-O แต่จะต้องดูอย่างแน่นอน
Pierre Pretorius

ลิงก์เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการวิเคราะห์ความซับซ้อนซึ่งบางคนอ้างถึงการเรียกขานว่า Big-O มันไม่ยากอย่างที่คิดก่อน เมื่อคนพูดว่างานจะทำงานในเวลาเชิงเส้นหรือเวลาพหุนามนี่คือสิ่งที่พวกเขากำลังอ้างถึง การสำรองฐานข้อมูลโดยทั่วไปเป็นแบบเส้นตรงหมายความว่าขนาดฐานข้อมูล 2x ใช้เวลาในการสำรอง 2 เท่า การเรียงลำดับข้อมูลจะไม่เป็นเชิงเส้น ไฟล์ 2x ใหญ่เท่าต้องใช้เวลามากกว่า 2x ในการเรียงลำดับ bigocheatsheet.comในวิกิพีเดียen.wikipedia.org/wiki/Time_complexityกล่าวถึงการเรียงลำดับการเปรียบเทียบที่เร็วที่สุดที่เป็นไปได้คือ "linearithmic time" = n log (n)
Joshua Huber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.