Verbindung 2er Tabellen, zeitlich gesteuert (Archiv- + Tages-aktuelle Daten)

Romero

Aktiver Benutzer
Beiträge
46
Hallöchen liebe SQL-Gemeinde,

da ich nicht nur hier im Forum ein Frischling bin, sondern auch im Umgang mit dem MS-SQL-Server, würde ich mich dennoch sehr darüber freuen, wenn ihr mir helfen bzw. unterstützen könnt.

Meine Frage bzw. meine Problematik beschreibt sich wie folgt:

Bei uns im Betrieb haben wir u.a. eine Produktiv-Datenbank, welche jeden Abarbeitungsschritt aufzeichnet (u.a. mit Material-ID, Auftragsnummer, Event-Start, Event-Ende, etc.). Diese Produktiv-Datenbank besitzt eine Vielzahl an Tabellen mit unterschiedlichen Eintragungen, auf die ich zugreife.
Um für Auswertungen die Produktiv-DB performance-seitig nicht lahmzulegen, haben wir uns dazu entschlossen, eine Archiv-DB-Tabelle zu kreieren, welche einmalig die Daten der Vergangenheit abspeichert. Sprich: heute wird diese Tabelle erstellt und es werden ALLE Werte bis gestern 24:00 abgelegt. Und diese Tabelle liegt ausschließlich auf einer Nicht-Produktiv-DB.

Zusätzlich zu dieser Archiv-DB-Tabelle wird hier noch eine Daily-DB-Tabelle erstellt, welche die Tages-aktuellen Daten speichert. Diese greift aber auf die Produktiv-DB zu.

Nachdem beide Tabellen erstellt wurden (Archiv nur einmal), möchte ich nun gern, dass nach dem heutigen Tag ab 23:59:59 die Werte an die Archiv-DB-Tabellen angehangen werden. Zeitgleich aber die Daily-DB-Tabelle bereinigt und für den neuen Tag bereitgestellt werden.

Ein weiterer Clou ist aber, dass ich hier noch Tableau als Visualisierer nutze.
Im Tableau werden nun die Archiv-DB-Tabelle und die Daily-DB-Tabelle mit einander verbunden und auf den Tableau-Server hochgeladen, damit hier dann mittels Tableau die Daten visualisiert werden können.
Diese Verbindung mittels Tableau habe ich bereits an anderen Stellen schon erreicht und Bedarf (bis jetzt) keiner weiteren Betrachtung.

Wichtig für mich:
Wie bekomme ich beide Tabellen zusammen, so dass die Archiv-DB-Tabelle weiter wächst und die Daily-DB-Tabelle mittels Zeit-Vorgabe die Daten überträgt und zeitnah geleert wird.

Würde mich über jeden Input eurerseits erfreuen.
Ggf. auch mit Code-Auszügen :)

LG Romero
 
Werbung:
Nachdem beide Tabellen erstellt wurden (Archiv nur einmal), möchte ich nun gern, dass nach dem heutigen Tag ab 23:59:59 die Werte an die Archiv-DB-Tabellen angehangen werden. Zeitgleich aber die Daily-DB-Tabelle bereinigt und für den neuen Tag bereitgestellt werden.

Was Du suchst nennt sich Partitioning.
 
akretschmer, vielen Dank für die schnelle Antwort.

Jetzt habe ich aber einen riesigen Fehler gemacht und gesagt, dass es sich um Tabellen handelt.
Dabei sind es doch Views und da würde doch die Partitionierung gar nicht funktionieren oder? Da ich noch n Newbie bin, hoffe ich auf Nachsicht :)

Nun aber zu der Partitionierung. Da es nur bei Tabellen funktioniert (Annahme), würde ich gern wissen, wie ich die beiden Views miteinander verbinde.
Kann ich das über UNION machen??? Beide Views sind exakt gleich aufgebaut.

In etwa so:
SELECT * FROM DBO.View1
UNION ALL
SELECT * FROM DBO.View2

Da die Abfrage oder die UNION ALL auf der Nicht-Produktiven-DB erfolgt, sollte es performance-seitig kein Problem darstellen oder? Es geht hier wirklich nur da drum, dass (da beide Views vom Aufbau her identisch sind) die Tages-aktuellen Werte an die Archiv angehangen werden.
 
Zuletzt bearbeitet:
Ok das habe ich verstanden :)

Aber warum empfiehlst du hier die Partitionierung der beiden Views?
Warum kein UNION ALL (oder ähnliches)?

Ich hangle mich gerade an dieser Erklärung hier durch Erstellen partitionierter Tabellen und Indizes - SQL Server | Microsoft Docs aber irgendwie kann ich keine Partition mit Hilfe des vorgeschlagenen Assistenten erstellen (komm bei der View nicht auf die Auswahl "Speicher" -> "Partition erstellen...").

Sorry das ich dich hier ein wenig hartnäckiger nerve aber hast du zufällig eine Doku zum Nachlesen?

LG Romero
 
Hallo akretschmer,

ich komme hier irgendwie nicht weiter.
Ich habe deine Doku aufmerksam gelesen, habe auch Google unterstützend befragt, aber ich komme leider nicht weiter, eine Anweisung so zu erstellen, dass es "für mich" funktioniert.

Hast du einen kompletten Code für mich zum Nachvollziehen, wo ich ggf. nur meine Views da eintragen bräuchte.
Wäre auch hier eine INSERT INTO - Anweisung möglich, welche u.a. mit einer IF-Anweisung mittels Datum wie z.B. <= FORMAT(DATEADD(SECOND, 86399, CAST(CAST(GETDATE() AS DATE) AS DATETIME2)), 'dd.MM.yyyy HH:mm:ss') ausgeführt wird?

Und wann wird dieser Script ausgeführt?

Würde mich riesig darüber freuen, wenn du oder ihr mir hier helfen könnt.

LG Romero
 
Aloha Romero :)

hab ich das richtig verstanden das du eine Tabelle hast in der die Produktivdaten geschrieben werden und eine weitere Tabelle(Archiv) wo "alt"-Daten geschrieben werden? Sprich in der Produktiv Tabelle sind nur Datensätze der letzten 24h und alles was davor war, ist in der Archiv Tabelle? Spontan fällt mir dazu ein Agent Job ein, der alle X Stunden die Daten verschiebt.
 
Hallo Chuky666,

genau so richtig zusammengefasst.
Die Alt-Daten werden hier aber "nur" 1mal geschrieben um den Datensatz zu erhalten, alle anderen Daten werden, wie richtig geschrieben, aller 24h von Produktiv ins Archiv geschrieben.
Wie genau sieht den dieser Agent Job aus?
Die Abfrage müsste dann immer bei 23:59:59 des aktuellen Tages erfolgen und die Daten transferieren.

LG Romero
 
Was heißt nur 1 mal geschrieben um den Datensatz zu erhalten? Maschine/Programm XYZ schreibt einen Datensatz in die Produktiv-Tabelle.... x Stunden später kommt der Agent Job und verschiebt alle Datensätze älter 24h in die Archiv-Tabelle. Oder sollen in der Produktiv-Tabelle alle Datensätze erhalten bleiben und diese nur kopiert?
 
Ja, die Daten in der Produktiv-Tabelle sollten weiterhin erhalten bleiben.
Archiv-Tabelle mit Datensatz aus Produktiv-Tabelle älter als 24h, die Tages-aktuelle Tabelle mit Daten aus Produktiv-Tabelle der letzten 24h. Diese Daten jeweils als Kopie, wobei die Archiv-Tabelle weiter wächst, die Tages-aktuelle Tabelle immer die letzten 24h anzeigt.
 
Doofe Frage dazu: Wozu genau brauchst du in der Ursprungs Tabelle Daten die älter als 24h sind, wenn du die Daten eh im Archiv hast? So hältst du die Daten doppelt vor, was vllt. nicht notwendig ist?(außerdem käme es der performance auf der ursprungs-tabelle zugute wenn die nicht zig rows inne hat ;) )

oke.. dann musst du ja "nur" noch die Tabellen designen und einen Job basteln der die Daten von A nach B kopiert :) Stichwort wäre hier SQL Agent-Job. In dem kannst du SQL-Statements ausführen lassen oder SSIS Pakete oder oder oder und das auch noch Zeitgesteuert+mail an einen Operator usw :)
 
Zu deine "doofen" Frage ;)
In der Produktiv-Tabelle sind erst einmal ALLE Daten drin, die jemals erfasst wurden.
Nun möchte ich aber diese Daten auswerten lassen, dabei aber die Produktion mit den Abfragen nicht lahm legen, da hier noch andere systemseitige (Such-)Abfragen drüber laufen. Daher ein Archiv mit alten Daten und ein Täglich mit 24h-Daten.

Die Daten wären, wie du richtig erwähnst, doppelt. Aber um (Tableau-)Abfragen zu generieren, ohne die Produktiv-Tabelle weiter zu belasten, haben wir uns für diesen Weg entschieden.
Aber deinen Ansatz werde ich hier mal ansprechen, was die Ursprungs-Tabelle und den Daten der mehr als letzten 24h betrifft.

Genau das suche ich. Einen Job-Lauf, der die Daten von A (24h-Tabelle) nach B (Archiv-Tabelle) kopiert und dann die Tabelle A wieder "leert".
Meinst du sowas hier?
Erstellen eines Auftrags - SQL Server Agent | Microsoft Docs

LG Romero
 
Werbung:
Zurück
Oben