Cara efisien untuk membandingkan dua set data besar dalam SQL


12

Saat ini, saya membandingkan dua set data, yang berisi StoreKey/ProductKeykombinasi unik .

Kumpulan data pertama memiliki StoreKey/ProductKeykombinasi unik untuk penjualan antara awal Januari 2012 dan akhir Mei 2014 (hasil = 450 ribu baris). Kumpulan data ke-2 memiliki StoreKey/ProductKeykombinasi unik , untuk penjualan mulai Juni 2014, hingga hari ini (hasil = 190 ribu baris).

Saya mencari untuk menemukan StoreKey/ProductKeykombinasi yang ada di set ke-2, tetapi tidak di set ke-1 - yaitu produk baru yang dijual dari awal Juni.

Sampai sekarang, saya telah membuang dua set data ke tabel temp, membuat indeks untuk kedua tabel pada kedua tombol, dan menggunakan EXCEPTpernyataan untuk menemukan item unik.

Apa cara paling efisien untuk membandingkan set data besar seperti itu? Apakah ada cara yang lebih efisien untuk melakukan perbandingan besar seperti ini?

Jawaban:


10

Menggunakan EXCEPT menurut saya adalah cara untuk pergi ke sini, tetapi Anda mungkin ingin mempertimbangkan kembali penggunaan tabel sementara. Dengan melakukannya, Anda secara efektif menggandakan data Anda dalam memori, yang akan memperlambat Anda. Jika indeks yang Anda butuhkan ada pada tabel sumber (seperti yang saya duga), bandingkan saja SELECTS yang sesuai:

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

1
Benar, tabel memang memiliki indeks, tetapi ini adalah indeks berkerumun di dua bidang yang diperlukan, ditambah bidang bernama TransactionDateKey. Apakah perbedaan besar terlihat jika saya menerapkan salah satu: a.) Indeks berkerumun di StoreKey dan ProductKey b.) Dua indeks terpisah non-cluster pada StoreKey dan ProductKey masing-masing?
Pierre Pretorius

1
Saya berasumsi TransactionDateKeyadalah kolom yang digunakan untuk memfilter periode waktu. Dalam hal ini indeks berkerumun di TransactionDateKey, StoreKeydan ProductKeysempurna.
Twinkles

1

Jika Anda terbiasa dengan algoritma (kompleksitas Big-O), melakukan perbandingan ini adalah yang terbaik O (n log (n)). Algoritme yang paling efisien akan mengurutkan kedua set data, kemudian membuat run down yang digabungkan secara paralel untuk menemukan kunci yang cocok (atau tidak cocok). Sebagian besar pengoptimal RDBMS akan melakukan ini secara otomatis untuk Anda ketika Anda menggunakan EXCEPTatau MINUS. Paket menjelaskan Anda akan mengonfirmasi atau mengonfirmasi. Jika Anda melihat loop bersarang, Anda melakukan O (n ^ 2), tidak efisien.


Terima kasih Josua. Tidak terbiasa dengan kompleksitas Big-O, tetapi pasti akan melihatnya.
Pierre Pretorius

Tautan untuk mempelajari lebih lanjut tentang Analisis Kompleksitas, yang oleh sebagian orang disebut bahasa sehari-hari sebagai Big-O. Tidak sesulit kelihatannya pada awalnya. Ketika orang mengatakan tugas akan berjalan dalam waktu linear atau waktu polinomial, inilah yang mereka maksudkan. Pencadangan basis data secara linier, artinya ukuran 2x basis data membutuhkan waktu 2x untuk pencadangan. Menyortir data membuatnya tidak linier. File 2x lebih besar membutuhkan lebih dari 2x waktu untuk menyortir. bigocheatsheet.com , Dalam wiki en.wikipedia.org/wiki/Time_complexity disebutkan jenis perbandingan tercepat yang mungkin adalah "waktu linearithmic" = n log (n).
Joshua Huber
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.