SQL Server - Büyük tabloyu birincil anahtar olmadan dışa aktarma


9

SQL Server ve MySQL arasında birincil anahtar olmadan büyük bir tablo ~ 500 milyon satır senkronize etmek gerekiyor. Tablo yalnızca kümelenmiş bir bileşik benzersiz olmayan bir dizine sahiptir.

Sunucular arasında bir ODBC bağlantım var, ancak ~ 8 milyon satırlık bir içe aktarma yaklaşık 45 dakika sürdü, bu yüzden herhangi bir noktada kesintiler olabileceğinden daha büyük bir tek içe aktarmanın mantıksız olacağına inanıyorum. Varolan tablo yapısını değiştiremiyorum, başka tablolar da ekleyebilirim. Daha fazla okumadan sonra, ofset / getirme büyük tablolar için bir seçenek değildir. "Seç ... burada x arasında ... ile ..." seçeneği benzersiz bir anahtarım olmadığı için bir seçenek değil.

Tabloyu tüm satırları içereceği garanti edilen gruplar halinde nasıl dışa aktarabilirim? Benim sorunum, kümelenmiş anahtar benzersiz olmadığından, fiziksel satırların ardışık sorgular arasında aynı sıraya sahip olmasını garanti etmeyecek ve tüm sütunların çok uzun sürdüğünden sonra sıralanacak. Ve toplu işlerin ODBC veya CSV dosyaları aracılığıyla taşınmasını nasıl önerirsiniz?


Bu tekrar (olağan operasyon) veya bir kez operasyon olacak mı?
Bogdan Bogdanov

İlk dışa aktarma bir defalık işlem olacak, yeni kayıtlar veya güncellemeler gibi senkronizasyon değişiklikleri tekrarlamalı olmalıdır. CDC bir seçenek değildir, ancak ilk geçişten sonra daha fazla araştırma yapacaktır.
hiç kimse

Bu konuda yardım almayı düşünüyorum, tüm süreci daha ayrıntılı olarak açıklamalısınız (çok karmaşık bir sorununuz var gibi görünüyor)
Bogdan Bogdanov

"Kümelenmiş anahtar benzersiz olmadığından, fiziksel satırların ardışık sorgular arasında aynı sıraya sahip olmasını garanti etmeyecek şekilde sipariş vermek" dikkat edin. Satır sırası korunmadığından (bazı dizi verileriniz yoksa) aynı fiziksel satır sırasını almaya güvenemezsiniz. Satırların sırası varsayılan olarak ekleme sırası veya dizin sırası için geçerli değildir, ancak ORDER BY deyimi tarafından tanımlanır .
RLF

Evet, RLF, katılıyorum. Sütunların tümü ints, A, B, C, D, E'dir. Kümelenmiş anahtar ABC üzerindedir. ABC kombinasyonu benzersiz değildir, ABCD kombinasyonu da değildir. Benzersiz olmayan bir sütun (lar) ı "sırala", tüm tabloyu toplu olarak dışa aktarmama izin verir mi? Ve Bogdan Bodganov, Stack platformu karmaşık sorunları caydırıyor, sadece soruyu ele almak daha iyi. Büyük tabloyu satır kaybı olmadan toplu olarak mümkün olduğunca hızlı nasıl dışa aktarabilirim?
hiç kimse

Yanıtlar:


0

Kaynak tabloya karşı güncellemeleriniz veya silmediğiniz varsayılarak aşağıdakileri deneyebilirsiniz:
1. CTAS sözdizimini (SQLServer için SELECT * into source_table_copy FROM source_table) kullanarak mevcut tablonun bir kopyasını oluşturun . Bu tür işlemler büyük masalar için bile çok hızlıdır.
2. Yeni kayıtları kopyalayana after inserttetikleyici ekleyin . 3. Şimdi tüm yeni kayıtlar da gitmek ve toplu olarak Mysql kopyalanan tablodan veri taşıyabilirsiniz. Örneğin, 2 sunucu arasında bir bağınız varsa, her şey TSQL saklı yordamı çerçevesinde yapılabilir. Örneğin, 20 sunucuya kadar yeni sunucuya taşınan bir kod parçası,source_tablesource_table_copy
source_tablesource_table_copy

 --declare table variable to keep deleted records until they delivered to target host 
  BEGIN TRANSACTION;
  DELETE TOP (20) FROM source_table_copy OUTPUT DELETED.* INTO @Table_Var;

  --insert data into linked server , or to csv file
  COMMIT; 

Verileri okumak ve daha sonra where current ofyan tümceyi silmek için CURSOR'u kullanmak da mümkündür .

** İdeal olarak, uygulamaların source_table1. adım sırasında veri after inserteklemesini önlemeniz gerekir. Kesinlikle imkansızsa, 1. adımdan hemen önce eklenen ve verileri tamamlayabildiğim başka bir tabloya kopyalayan bittikten hemen sonra bir tetikleyici ile devam edeceğim sonra ile birleşir source_table_copy.


Çözüm için teşekkürler, ben de bir şey deniyordum, ancak normal bir insert ile. CTAS sözdizimini deneyip hızlandıracağını görmek için deneyeceğim. Takip eden soru, sakıncası yoksa: "kesici uçtan sonra tetikleyici" performansları etkiler mi?
hiç kimse

Tetik gövdesi çok basit olduğu için (sadece başka bir tabloya veri ekleyin), performans etkisi minimum olacaktır.
a1ex07
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.