Minimum kesinti süresi ile büyük miktarda veriyi yeniden içe aktarmanın en iyi yolu


11

Ben haftada bir kez (sadece üç int / bigint cols) IP arama (salt okunur referans) verileri içeren yaklaşık 500.000 kayıtları almak gerekiyor.

Verileri mevcut tabloyla birleştirme konusunda endişelenmek istemiyorum, eski ve yeniden içe aktarmayı temizlemeyi tercih ederim.

İdeal olarak, veri üzerinde çalışan sorgular çalışmaya devam eder (bunların çoğunu alamayız ve içe aktarma işlemi gerçekleşirken biraz daha yavaş çalışmaları kabul edilebilir, ancak 7/24 çalışmaları gerekir " çalışma saatleri dışında "seçeneği yoktur).

Şimdiye Kadar Denenen Şeyler

SSIS: Tabloyu kesip içe aktaran bir SSIS paketi oluşturdum - çalışması yaklaşık 30 saniye sürüyor (gerçekten çok uzun).

Temp Tablosu: Temp tablasına içe aktarma, kesme ve kopyalama işlemleri de yaklaşık 30 saniye sürer.

BCP: Toplu İçe Aktarma da oldukça yavaş (bazı nedenlerden ötürü SSIS'den daha yavaş (korumak için herhangi bir endeks olmadan bile) - Sanırım bu char-> int / bigint işlemleriyle ilgili bir şey: /

Ayna masası? Şu anda, tabloyu bir görünüm yoluyla okumayı, verileri bir ayna tablosuna aktarmayı ve görünümü bu tabloyu gösterecek şekilde değiştirmeyi merak ediyorum ... bu hızlı olacak gibi görünüyor, ama küçük görünüyor bana biraz acayip.

Bu yaygın bir sorun olmalı gibi görünüyor, ancak önerilen uygulamaları bulamıyorum - herhangi bir fikir en çok takdir edilecektir!

Teşekkürler

Yanıtlar:


13

Geçmişte kullandığım bir çözüm (ve burada ve daha önce StackOverflow'da tavsiye ettim) iki ek şema oluşturmaktır:

CREATE SCHEMA shadow AUTHORIZATION dbo;
CREATE SCHEMA cache  AUTHORIZATION dbo;

Şimdi cacheşemada tablonuzun bir taklitçisini oluşturun :

CREATE TABLE cache.IPLookup(...columns...);

Şimdi anahtar işleminizi yaparken:

TRUNCATE TABLE cache.IPLookup;
BULK INSERT cache.IPLookup FROM ...;

-- the nice thing about the above is that it doesn't really
-- matter if it takes one minute or ten - you're not messing
-- with a table that anyone is using, so you aren't going to
-- interfere with active users.


-- this is a metadata operation so extremely fast - it will wait
-- for existing locks to be released, but won't block new locks
-- for very long at all:

BEGIN TRANSACTION;
  ALTER SCHEMA shadow TRANSFER    dbo.IPLookup;
  ALTER SCHEMA dbo    TRANSFER  cache.IPLookup;
COMMIT TRANSACTION;


-- now let's move the shadow table back over to
-- the cache schema so it's ready for next load:

ALTER SCHEMA cache TRANSFER shadow.IPLookup;
TRUNCATE TABLE cache.IPLookup; 

-- truncate is optional - I usually keep the data
-- around for debugging, but that's probably not
-- necessary in this case.

Yabancı anahtarlarınız ve diğer bağımlılıklarınız varsa bu daha zahmetli olacaktır (çünkü bunları düşürmeniz ve yeniden oluşturmanız gerekebilir) ve elbette istatistikleri vb. Tamamen geçersiz kılar ve bu da planları etkileyebilir, ancak en önemli şey, minimum kesinti ile kullanıcılarınızın önünde doğru veri elde etmektir, bu bir yaklaşım olabilir.


Teşekkürler, başka bir ilginç alternatif - Bence son iki ifade oldukça doğru değil, gölgeyi önbelleğe taşımalı ve önbelleği kesmelidir. Eş anlamlıların da kullanılabileceğini merak ediyorum.
Mark

Haklısın, bunları karıştırdım. Eşanlamlıların nasıl daha iyi olacağından tam olarak emin değilim, sanırım bu da bir yaklaşım - eşanlamlılığı gösteren bir görünüme sahip olun ve diğer sürümü doldurduğunuzda bir işlemdeki temel eşanlamlıyı değiştirin. Şahsen ben bunu biraz daha iyi buluyorum - dbo.IPLookup sorgularken, bu görünüm ve eşanlamlı kovalamak zorunda kalmadan "geçerli" tablo olduğunu biliyorum.
Aaron Bertrand

FYI Bu hafta bu konuyu
Aaron Bertrand
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.