SQL'deki iki büyük veri kümesini karşılaştırmanın etkili bir yolu


12

Şu anda, benzersiz StoreKey/ProductKeykombinasyonlar içeren iki veri kümesini karşılaştırıyorum .

İlk veri seti, StoreKey/ProductKeyOcak 2012 ile Mayıs 2014 sonu arasında benzersiz satış kombinasyonlarına sahiptir (sonuç = 450K satır). 2. veri seti StoreKey/ProductKeysatışlar için Haziran 2014'ten bugüne kadar benzersiz kombinasyonlara sahiptir (sonuç = 190K satır).

StoreKey/ProductKey2nci sette olan ancak 1nci sette olmayan kombinasyonları bulmak istiyorum - yani Haziran başından itibaren satılan yeni ürünler.

Şimdiye kadar, iki veri kümesini geçici tablolara döktüm, her iki tuşta da her iki tablo için dizinler oluşturdum ve EXCEPTifadeyi benzersiz öğeler bulmak için kullandım .

Bu kadar büyük veri kümelerini karşılaştırmanın en etkili yolu nedir? Bu tür büyük karşılaştırmaları yapmanın daha etkili bir yolu var mı?

Yanıtlar:


10

EXCEPT kullanmak bence buraya gitmenin bir yoludur, ancak geçici tablonun kullanımını yeniden düşünmek isteyebilirsiniz. Böylece verilerinizi etkin bir şekilde bellekte çoğaltabilirsiniz, bu da sizi yavaşlatır. İhtiyacınız olan dizinler kaynak tablolarda (şüphelendiğim gibi) mevcutsa, uygun SEÇİMLERİ karşılaştırın:

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

1
Doğru, tablonun dizinleri var, ancak gerekli iki alanda kümelenmiş bir dizin ve TransactionDateKey adlı bir alan. Aşağıdakilerden birini uygularsam büyük bir fark görülür: a.) StoreKey ve ProductKey üzerinde kümelenmiş bir dizin b.) StoreKey ve ProductKey'de sırasıyla iki ayrı kümelenmemiş dizin?
Pierre Pretorius

1
TransactionDateKeyZaman periyodunu filtrelemek için kullanılan sütun olduğunu düşünüyorum . Bu durumda kümelenmiş dizin TransactionDateKey, StoreKeyve ProductKeymükemmeldir.
Twinkles

1

Algoritmaları (Big-O karmaşıklığı) biliyorsanız, bu karşılaştırmayı gerçekleştirmek en iyi O (n günlüğü (n)) olur. En verimli algoritma her iki veri kümesini sıralar, ardından eşleşen (veya eşleşmeyen) anahtarları bulmak için paralel olarak birleştirilmiş bir çalışma yapar. Çoğu RDBMS iyileştiricisi, EXCEPTveya seçeneğini kullandığınızda bunu sizin için otomatik olarak yapar MINUS. Açıklama planınız onaylanacak veya onaylanmayacaktır. İç içe döngüler görürseniz, o kadar verimli değil, O (n ^ 2) yapıyorsunuz.


Teşekkürler Josua. Big-O karmaşıklığına aşina değil, ama kesinlikle bir göz atacak.
Pierre Pretorius

Bazı insanların konuşma dilinde Big-O olarak adlandırdığı Karmaşıklık Analizi hakkında daha fazla bilgi edinmek için bağlantılar. İlk başta göründüğü kadar zor değil. İnsanlar bir görevin doğrusal zamanda veya polinom zamanında çalışacağını söylediklerinde, bundan bahsediyorlar. Veritabanı yedeklemesi genel olarak doğrusaldır, yani 2x veritabanı boyutunun yedeklenmesi 2x zaman alır. Bir veri sıralama olsa doğrusal değil ayarlayın. 2x büyüklüğünde bir dosyanın sıralanması 2 kattan fazla zaman alır. bigocheatsheet.com , wiki en.wikipedia.org/wiki/Time_complexity içinde mümkün olan en hızlı karşılaştırma sıralamasında "doğrusal zaman" = n log (n) belirtilir.
Joshua Huber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.