Wir haben diese große Datenbank (> 1 TB), die wir "verkleinern" möchten. Die Datenbank dreht sich um eine Hauptentität, nennen wir sie "Besuch". Angenommen, es handelt sich um eine Datenbank für eine medizinische Praxis.
Es gibt insgesamt 30 "Besuchstypen", wie z. B. Verfahren, jährliche Besuche, Nachsorgeuntersuchungen, Impfungen usw., von denen jeder eine Hilfstabelle für "Besuch" ist, z. B. "visit_immuno".
Die Datenbank hat seit dem Jahr 2000 ungefähr 12 Jahre an Daten gesammelt. Jemand hat vorgeschlagen, dass wir ungefähr 3 Jahre an Daten in der "Live" -Version aufbewahren und den Rest in einer "old_data" -Datenbank. Das Datum wird NUR in der Tabelle "Besuch" gespeichert, da es normalisiert ist. Die Visit-Tabelle enthält auch eine ROWVERSION
Spalte und eine BIGINT
Pseudoidentitätsspalte (gruppiert). Nehmen wir in jeder Hinsicht an, der Clustering-Schlüssel wird von einer SEQUENCE (SQL Server 2012 Enterprise) gefüllt - wir werden ihn benennen cid
.
Das visit.date
ist nicht immer in der gleichen Reihenfolge wie der Clustering-Schlüssel. Wenn ein Arzt beispielsweise längere Besuche durchführt und mit seinem "Aktenkoffer" Daten zurückgibt, werden diese in der Haupttabelle zusammengeführt. Es gibt auch einige Aktualisierungen an der Tabelle "visit", die dazu führen, dass die ROWVERSION
Spalte nicht mehr mit den Spalten cid
und synchron date
ist. Einfach gesagt, es werden aus diesem Grund weder geeignete Partitionsschlüssel erstellt ROWVERSION
noch erstellt cid
.
Die Geschäftsregel zum Entfernen von Daten aus dem "Live" lautet, dass der visit.date
Zeitraum länger als 36 Monate sein muss und ein untergeordneter visit_payment
Datensatz vorhanden sein muss. Die Datenbank "old_data" enthält außer keine der Basistabellen visit%
.
Am Ende haben wir also:
Live DB (täglicher Gebrauch) - Alle Tabellen Old-Data DB - ältere Daten für die visit%
Tabellen
Der Vorschlag sieht eine kombinierte Datenbank vor , bei der es sich um eine Shell handelt, die Synonyme für ALLE Basistabellen in den Live DB
(Ausnahme- visit%
) Plus- Ansichten enthält , die ALLE in den visit%
Tabellen in den beiden Datenbanken vereinen.
Unter der Annahme, dass die gleichen Indizes in der Old-Data
Datenbank erstellt werden, funktionieren die Abfragen in den UNION-ALL- Ansichten einwandfrei ? Welche Art von Abfragemustern kann den Ausführungsplan für die UNION-ALL- Ansichten auslösen ?
Antworten:
LiveDb
Nehmen Sie zur Vereinfachung an, dass die Live-Datenbank und die Archivdatenbank aufgerufen werdenArchiveDb
LiveDb
indem SieArchiveDb
über ein Synonym auf die Tabellen in der Datenbank verweisen. (Es ist nicht erforderlich, eine kombinierte Datenbank mit Synonymen zu erstellen.)visit.date
diese Spalte ein und denormalisieren Sie sievisit_payments
auch, wenn sie noch nicht vorhanden ist (dies verbessert die Leistung der gemeinsamen Verknüpfung).LiveDb
damit alle Verknüpfungen mit den kleineren Tabellen lokal bleibenLiveDb
undArchiveDb
das beschreibt den Bereich dervisit.date
in der Tabelle enthalten. Auf diese Weise kann das Optimierungsprogramm die Archivtabelle sowohl bei Suchvorgängen als auch bei Überprüfungen, die die Spalte enthalten, entfernenvisit.data
. Sie müssen diese Einschränkung regelmäßig aktualisieren.visit.data
. Dies ist zusätzlich zu dem Hinweis, den Sie bereits in der Check-Einschränkung angegeben haben. Dies maximiert die Wahrscheinlichkeit, dass Filter heruntergedrückt werdenAchiveDb
in Betracht, den SIMPLE-Wiederherstellungsmodus zu aktivieren, falls dies noch nicht geschehen ist. Es ist unwahrscheinlich, dass Sie Transaktionsprotokollsicherungen von benötigenArchiveDb
LiveDb
und zu erzwingenArchiveDb
All dies garantiert nicht, dass das Optimierungsprogramm die Archivtabellen aus Such- und Scanvorgängen entfernt, erhöht jedoch die Wahrscheinlichkeit.
Wenn die Beseitigung nicht geschieht. Dies ist der Effekt, den Sie möglicherweise sehen (diese Liste ist möglicherweise unvollständig). Bei Suchvorgängen erhalten Sie bei jeder Abfrage einen zusätzlichen Suchvorgang (dies führt zu IOPS). Bei Überprüfungen kann die Leistung desaströs sein, da Sie möglicherweise sowohl die Archiv- als auch die Livetabellen überprüfen. Hier sind die typischen Möglichkeiten, wie Sie den Optimierer auslösen können:
visit%
Tabellen zusammenfügen und dievisit.data
in den Verknüpfungskriterien nicht enthalten (aus diesem Grund möchten Sie denormalisieren). Aus diesem Grund möchten Sie möglicherweise einige Ihrer Abfragen ändernvisit.data
und einer anderen Tabelle erhalten (zum Beispiel eine Datumsdimension), erhalten Sie möglicherweise nicht die richtige Eliminierung von Tabellenvisit.data
, suchen Sie beispielsweise direkt nach dem Schlüssel der Ansicht.Für das letzte Szenario können Sie sich gegen die schlimmsten Auswirkungen schützen, indem Sie eine weitere Prüfbedingung für
cid
- hinzufügen, wenn dies möglich ist. Sie haben erwähnt, dass die Reihenfolge dercid
nicht "sauber" in Bezug auf die Daten und den Fortschritt der Zeilen in der Tabelle. Könnten Sie jedoch eine Tabelle pflegen, die folgende Informationen enthält: "Seitdem gibt escid
über dieser Nummer keine mehrvisit.data
" oder ähnliches? Dies könnte dann zu einer zusätzlichen Einschränkung führen.Eine andere Sache, die Sie beachten sollten, ist, dass parallele Abfragen möglicherweise VIEL mehr Threads erzeugen, wenn Sie die partitionierte Ansicht abfragen (da beide "Untertabellen" denselben parallelen Optimierungen ausgesetzt sind). Aus diesem Grund möchten Sie möglicherweise MAXDOP auf dem Server oder die parallelen Abfragen einschränken.
Übrigens, wenn Sie die Abfragen gut kennen - Sie benötigen möglicherweise nicht einmal dieselben Indizes in den beiden Datenbanken (dies setzt voraus, dass Sie zu 100% sicher sind, dass Sie die richtige Eliminierung von Tabellen erreichen). Sie könnten sogar die Verwendung von Spaltenspeichern für in Betracht ziehen
ArchiveDb
.quelle
Wir haben die alten Daten stapelweise in eine neu erstellte Datenbank geschrieben und die alten Daten aus der Live-Datenbank gelöscht. Auf diese Weise sind beide DB zugänglich. Sie können die neu erstellte Datenbank auch sichern und an einer anderen Stelle wiederherstellen, um den großen Platzbedarf der Produktionsserver zu verringern. Hoffe, das ist eine akzeptable Lösung für Ihre Bedürfnisse.
quelle