Der beste Weg, um große Datenmengen mit minimalen Ausfallzeiten erneut zu importieren

11

Ich muss ungefähr einmal pro Woche ungefähr 500.000 Datensätze mit IP-Suchdaten (schreibgeschützte Referenz) importieren (nur drei int / bigint-Spalten).

Ich möchte mich nicht wirklich darum kümmern, die Daten mit der vorhandenen Tabelle zusammenzuführen. Ich würde es vorziehen, die alte zu löschen und erneut zu importieren.

Im Idealfall werden Abfragen, die über die Daten ausgeführt werden, weiterhin ausgeführt (wir erhalten nicht viele davon, und es ist akzeptabel, dass sie während des Imports etwas langsamer ausgeführt werden, müssen jedoch rund um die Uhr verfügbar sein. außerhalb der Geschäftszeiten "ist keine Option).

Bisher versuchte Dinge

SSIS: Ich habe ein SSIS-Paket erstellt, das die Tabelle abschneidet und importiert. Die Ausführung dauert ungefähr 30 Sekunden (wirklich zu lang).

Temporäre Tabelle: Das Importieren in eine temporäre Tabelle, das Abschneiden und Kopieren dauert ebenfalls etwa 30 Sekunden.

BCP: Der Massenimport ist auch zu langsam (aus irgendeinem Grund ist er langsamer als SSIS (auch wenn keine Indizes gepflegt werden müssen) - ich vermute, dass dies etwas mit den Transaktionen char-> int / bigint zu tun hat: /

Spiegeltisch? Im Moment frage ich mich also, ob ich die Tabelle durch eine Ansicht lesen, die Daten in eine Spiegeltabelle importieren und die Ansicht so ändern soll, dass sie auf diese Tabelle verweist. Dies scheint schnell zu sein, aber es scheint winzig ein bisschen hacky für mich.

Dies scheint ein häufiges Problem zu sein, aber ich kann keine empfohlenen Vorgehensweisen finden - Ideen wären sehr willkommen!

Vielen Dank

Kennzeichen
quelle

Antworten:

13

Eine Lösung, die ich in der Vergangenheit verwendet habe (und hier und auf StackOverflow bereits empfohlen habe), besteht darin, zwei zusätzliche Schemas zu erstellen:

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

Erstellen Sie nun eine Nachahmung Ihrer Tabelle im cacheSchema:

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

Wenn Sie jetzt Ihren Schaltvorgang ausführen:

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.

Dies ist umständlicher, wenn Sie Fremdschlüssel und andere Abhängigkeiten haben (da Sie diese möglicherweise löschen und neu erstellen müssen), und natürlich macht es Statistiken usw. vollständig ungültig. Dies kann sich wiederum auf Pläne auswirken, aber wenn die Das Wichtigste ist, dass Sie Ihren Benutzern mit minimaler Unterbrechung genaue Daten zur Verfügung stellen. Dies kann ein zu berücksichtigender Ansatz sein.

Aaron Bertrand
quelle
Vielen Dank, eine weitere interessante Alternative - ich denke, die letzten beiden Aussagen sind nicht ganz richtig, sollten Schatten in den Cache verschieben und den Cache abschneiden. Ich frage mich, ob auch Synonyme verwendet werden könnten.
Mark
Du hast recht, ich habe die durcheinander gebracht. Ich bin mir nicht sicher, wie Synonyme besser wären. Ich denke, das ist auch ein Ansatz. Zeigen Sie auf ein Synonym und ändern Sie das zugrunde liegende Synonym in einer Transaktion, wenn Sie die andere Version ausgefüllt haben. Persönlich finde ich das etwas besser - wenn Sie dbo.IPLookup abfragen, wissen Sie, dass dies die "aktuelle" Tabelle ist, ohne die Ansicht und das Synonym verfolgen zu müssen.
Aaron Bertrand
Zu Ihrer Information
Aaron Bertrand