In Dynamics AX esiste un meccanismo di memorizzazione nella cache in cui le tabelle possono essere configurate per essere caricate in memoria e memorizzate nella cache. Questa cache è limitata a una determinata quantità di KB per evitare problemi di memoria. L'impostazione di cui sto parlando viene chiamata entiretablecache
e carica l'intera tabella in memoria non appena viene richiesto un singolo record.
Fino a poco tempo fa abbiamo fatto affidamento su alcuni script per verificare la dimensione delle tabelle con questa impostazione per vedere se la dimensione della tabella è superiore a questo limite.
Ora, tuttavia, entra in gioco la compressione e cose come sp_spaceused o sys.allocation_units sembrano riportare lo spazio effettivamente utilizzato dai dati compressi.
Ovviamente, il server delle applicazioni sta lavorando con dati non compressi, quindi la dimensione dei dati sul disco in SQL Server è irrilevante. Ho bisogno delle dimensioni effettive che avranno i dati non compressi.
Conosco sp_estimate_data_compression_savings ma come dice il nome, questa è solo una stima.
Preferirei avere le dimensioni più corrette possibili.
L'unico modo in cui ho potuto pensare è stato un SQL dinamico contorto che creava tabelle non compresse con la stessa struttura delle tabelle compresse, inserendo i dati compressi in quella tabella shadow e quindi controllando le dimensioni di quella tabella shadow.
Inutile dire che questo è un po 'noioso e richiede un po' di tempo per essere eseguito su un database di diverse centinaia di GB.
Powershell potrebbe essere un'opzione, ma non vorrei scorrere su tutte le tabelle per eseguirne una select *
per controllare le dimensioni dello script in quanto ciò inonderebbe semplicemente la cache e probabilmente richiederebbe anche molto tempo.
In breve, ho bisogno di un modo per ottenere la dimensione di ogni tabella poiché sarà una volta non compressa e con frammentazione fuori dall'equazione presentata all'applicazione, se possibile. Sono aperto a diversi approcci, T-SQL è preferito ma non sono contrario a Powershell o altri approcci creativi.
Supponiamo che il buffer nell'applicazione sia la dimensione dei dati. Un bigint ha sempre le dimensioni di un bigint e un tipo di dati carattere è di 2 byte per carattere (unicode). Anche i dati BLOB prendono le dimensioni dei dati, un enum è sostanzialmente un int e i dati numerici sono numerici (38,12), datetime è la dimensione di un datetime. Inoltre, non ci sono NULL
valori, sono memorizzati come una stringa vuota 1900-01-01
o zero.
Non c'è documentazione su come questo sia implementato, ma i presupposti si basano su alcuni test e sugli script utilizzati da PFE e dal team di supporto (che a quanto pare ignorano anche la compressione, poiché il controllo è incorporato nell'applicazione e l'app non può dire se i dati sottostanti sono compressi) che controllano anche le dimensioni della tabella. Questo link ad esempio afferma:
Evita di utilizzare le cache di Tutta la tabella per tabelle di grandi dimensioni (in AX 2009 su 128 KB o 16 pagine, in AX 2012 sull'impostazione dell'applicazione "Dimensione cache intera tabella" [impostazione predefinita: 32 KB o 4 pagine]) - passa invece alla memorizzazione nella cache dei record.