2 Tabellen in eine vorhandene schreiben: 500.000 Zeilen ca. > 7Std.

MysterioJN

SQL-Guru
Beiträge
158
Hallo zusammen,

ich habe derzeit folgendes Problem.

Wir haben einen neuen Dienstleister ab 2019. Dieser liefert somit nur Inhalte (allerlei Verkaufsinformationen) ab 2019. Das Front-End hingegen ist so aufgebaut, das man insbesondere für Controlling und Marketingfragen in anderen Jahren vergleichen kann.

Nennen wir hier die Tabelle einfach: t_AbflussAb2019 mit rund 130.000 Datensätzen

Diese wird jede Nacht NEU und mit weiteren Zeilen geliefert.
Das gesamte Front-End setzt auf diese Tabelle!



Zusätzlich hab ich in der selben DB eine Tabelle vom alten Dienstleister, mit Daten von 2017 & 2018, nach 100% gleichem Aufbau, Bedingungen, Feldtypen, Schlüssel etc.

Nennen wir die Tabelle einfach: t_AbflussBis2019 mit rund 400.000 Datensätzen



Idee:

Um zukünftig die Daten wieder komplett zu haben, muss ich ja "nur" t_AbflussBis2019 IN die nächtlich neu gelieferte t_AbflussAb2019 einfügen.

Dies mache ich über ein Schnittstellenprogramm, geplant in der Aufgabenverwaltung von Windows (.Batch).


Problem:
Es dauert für die 530.000 (nächtlich mehr werdenden) jetzt schon über 7 Stunden!
Das schaff ich zeitlich gar nicht, bevor die ersten morgens um halb 6 wieder an die EDV gehen und mit den Daten arbeiten. Von ca. 00:01 bis 02:00 Uhr bekommen wir ja erstmal die Daten vom Dienstleister.

Frage:
Habt ihr eine alternative Idee, wie man jede Nacht ab ca. 3 Uhr vlt. so eine stets gleichbleibende Tabelle (t_AbflussBis2019) in die stets neu gelieferte Tabelle (t_AbflussAb2019) einfügen kann?
Geht das z.B. irgendwie als automatisierter Zeit-Trigger - und das dann schneller?



Liebe Grüße Marco
 
Zuletzt bearbeitet:
Werbung:
Am einfachsten ist vermutlich die alte Tabelle als Basis zu nehmen und in die alte Tabelle die Daten der neuen Tabeller per INSERT SELECT einzufügen mit einem IGNORE von bereits bestehenden Datensätzen.

Effizient ist aber etwas anderes.
 
Du kannst auch einen MERGE schreiben, das ist aber erstmal alles am Problem vorbei. Ein Insert in eine Tabelle mit Select aus einer anderen Tabelle (selbe DB?) kann nicht so lange dauern, vor allem nicht bei sowenig Zeilen. Das sollte in ca 1 Sekunde ablaufen bei 400k Datensätze.

Jetzt können wir aber nicht wissen was alles passiert. Laufen dort Trigger, was für Indexe liegen auf der Tabelle und vor allem was macht überhaupt dein "Schnittstellenprogramm" bzw. der Batch.

Es gibt keinen Zeitgesteuerten Trigger aber man kann mit einem Batch auch SQL ausführen. Ist das SQL Express?
 
Jetzt hat er gerade mal 200.000 Datensätze hinzugefügt und bei etwas mehr als 4 Stunden.... spich es werden locker 10 Stunden.
Mist.

@ Walter: Ja derzeit läuft es so durch. Daher ja die langen Zeiten.

@ Ukulele: hmm. Hab gesehen, das dort 22 Indexe laufen auf dieser einen (Ziel-)Tabelle.
Jetzt habe ich es direkt in der Management Studio ausgeführt auf dem SQL-Server und es hat in rund 1,5 Minuten die Tabelle fertiggestellt.

INSERT INTO t_AbflussAb2019
SELECT * FROM t_AbflussBis2019

Das ist durchaus akzeptabel xD

(Nun anderes) Problem: Jetzt muss ich dieses INSERT automatisiert durchlaufen lassen jede Nacht. Du sprichst von einem Batch der SQL ausführt?
Hast du damit Erfahrung?
 
Also bei einer echten SQL Lizenz gibt es glaube ich noch weitere Möglichkeiten, bei einer Express Version habe ich das schon so umgesetzt:
Code:
"C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\SQLCMD.EXE" -S "SERVER\SQLEXPRESS" -U "username" -P "passwort" -i "D:\Scripte\outlook_copy.sql"
Das wird per Batch aufgerufen und in der outlook_copy.sql steht dann das auszuführende Query. Hier liegt User und Passwort in einer Datei, also besser du richtest einen User mit stark reduzierten Rechten ein und siehst zu das keiner auf das Script einfach so Zugriff hat. Außerdem solltest du dein SQL Query mit USE database; einleiten damit du definitiv auf der richtigen DB arbeitest.

Ein bischen eleganter / schneller als INSERT kann MERGE sein, muss aber nicht. 22 Indexe sind schon ne Menge, theoretisch kann man die auch droppen und nach dem Insert neu erstellen, das ist aber alles Feintuning und lohnt bei 1,5 Minuten vermutlich nicht. Achte aber auf sauberes SQL, kein Select * etc.
 
Das klingt doch echt super. Jetzt genehmige ich mir erstmal ein Gläschen Wein. Vlt. tüftel ich heute Nacht mit deiner Hilfestellung weiter.
Ich dank dir so oder so schon sehr! Auch wenn DB-Admin nicht mehr mein originärer Job ist, machen die Exkurse für die Firma dorthin immer wieder Freude. Insbesondere wenn man gut dazulernt!

Ich wünsch dir ein schönes Wochenende!

LG
Marco
 
Moin Ukulele,

Hab jetzt eine Batch gemäß deiner Vorlage erstellen können.
Verweise auf den entsprechenden SQL-"Code".

Einzige Problem: Er "startet" diese Abfrage nicht. Wenn ich die Code-Datei manuell öffne und im Management Studio "Ausführen" anklicke, klappt es.
Kann ich ihm irgendwie das "ausführen" beibringen?


Code:
USE aid_Vertrieb

GO

INSERT INTO ble_tab_backup

SELECT

tab_rowid,
tad,
Jahr,
Monat,
Aken,
RnNummer,
RnDatum,
KdNr,
.....

FROM ble_tab_2017und2018


Hmm ich glaub eher, das liegt am
"C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\SQLCMD.EXE" -S "SERVER\SQLEXPRESS"

Jetzt kommt die wohl dümmste Frage, aber was muss ich da eintragen? Bzw. wie bekomme ich das raus was da reingehört?

Bei Server gebe ich den DNS-Name ein oder die IP ?
aber bei "SQLEXPRESS" ?
 
Zuletzt bearbeitet:
Werbung:
SERVER ist der NetBIOS Name oder FQDN, vermutlich geht auch IP und vermutlich muss es auch aufgelöst werden können :) Hinter dem Slash kommt die Instanz, die heißt bei der SQL Express Version standardmäßig so, kann aber auch anders sein. Wenn das ein normaler SQL ist kannst du das auch weg lassen dann müsste er auf die Standard-Instanz verbinden.

Aber dein Managementstudio muss sich ja auch an irgendwas verbinden....
 
Zurück
Oben