In Dynamics AX gibt es einen Caching-Mechanismus, mit dem Tabellen so konfiguriert werden können, dass sie in den Speicher geladen und zwischengespeichert werden. Dieser Cache ist auf eine bestimmte Menge an KB beschränkt, um Speicherprobleme zu vermeiden. Die Einstellung, von der ich spreche, wird aufgerufen entiretablecache
und lädt die gesamte Tabelle in den Speicher, sobald ein einzelner Datensatz angefordert wird.
Bis vor kurzem haben wir uns auf einige Skripte verlassen, um die Größe der Tabellen mit dieser Einstellung zu überprüfen, um festzustellen, ob die Tabellengröße über dieser Grenze liegt.
Jetzt kommt jedoch die Komprimierung ins Spiel und Dinge wie sp_spaceused oder sys.allocation_units scheinen den von den komprimierten Daten tatsächlich verwendeten Speicherplatz zu melden.
Offensichtlich arbeitet der Anwendungsserver mit nicht komprimierten Daten, sodass die Datengröße auf der Festplatte in SQL Server keine Rolle spielt. Ich benötige die tatsächliche Größe der unkomprimierten Daten.
Ich kenne sp_estimate_data_compression_savings, aber wie der Name schon sagt, ist dies nur eine Schätzung.
Ich würde es vorziehen, wenn die Größe so korrekt wie möglich wäre.
Die einzige Möglichkeit, die mir in den Sinn kam, war ein komplexes dynamisches SQL, das nicht komprimierte Tabellen mit derselben Struktur wie die komprimierten Tabellen erstellt, die komprimierten Daten in diese Schattentabelle einfügt und dann die Größe dieser Schattentabelle überprüft.
Das ist natürlich etwas langwierig und es dauert eine Weile, bis die Datenbank mehrere Hundert GB umfasst.
Powershell könnte eine Option sein, aber ich möchte nicht über alle Tabellen iterieren, um eine select *
Überprüfung der Größe im Skript durchzuführen, da dies nur den Cache überfluten und wahrscheinlich auch viel Zeit in Anspruch nehmen würde.
Kurz gesagt, ich brauche eine Möglichkeit, die Größe für jede Tabelle zu ermitteln, da diese einmal dekomprimiert und aus der Gleichung, die der Anwendung vorgelegt wird, fragmentiert wird, sofern dies möglich ist. Ich bin offen für verschiedene Ansätze, T-SQL wird bevorzugt, aber ich bin nicht gegen Powershell oder andere kreative Ansätze.
Angenommen, der Puffer in der Anwendung entspricht der Größe der Daten. Ein Bigint ist immer so groß wie ein Bigint, und ein Zeichendatentyp ist 2 Byte pro Zeichen (Unicode). BLOB-Daten haben auch die Größe der Daten, eine Aufzählung ist im Grunde ein Int und numerische Daten sind numerisch (38,12), datetime ist die Größe einer datetime. Es gibt auch keine NULL
Werte, sie werden entweder als leere Zeichenfolge 1900-01-01
oder als Null gespeichert .
Es gibt keine Dokumentation darüber, wie dies implementiert wird, aber die Annahmen basieren auf einigen Tests und den von PFE und dem Support-Team verwendeten Skripten (die anscheinend auch die Komprimierung ignorieren, da die Prüfung in der Anwendung erstellt wurde und die App dies nicht feststellen kann Wenn die zugrunde liegenden Daten komprimiert sind, überprüfen Sie auch die Tabellengrößen. Dieser Link zum Beispiel lautet:
Vermeiden Sie die Verwendung von EntireTable-Caches für große Tabellen (in AX 2009 über 128 KB oder 16 Seiten, in AX 2012 über die Anwendungseinstellung "Gesamte Tabellencachegröße" [Standard: 32 KB oder 4 Seiten]). Wechseln Sie stattdessen zum Aufzeichnungscaching.