W Dynamics AX istnieje mechanizm buforowania, w którym tabele można skonfigurować tak, aby były ładowane do pamięci i buforowane. Ta pamięć podręczna jest ograniczona do pewnej liczby KB, aby zapobiec problemom z pamięcią. Ustawienie, o którym mówię, jest wywoływane entiretablecache
i ładuje cały stół do pamięci, gdy tylko żądany jest pojedynczy rekord.
Do niedawna polegaliśmy na niektórych skryptach, aby sprawdzić rozmiar tabel, które mają to ustawienie, aby sprawdzić, czy rozmiar tabeli przekracza ten limit.
Teraz jednak wchodzi w grę kompresja i rzeczy takie jak sp_spaceused lub sys.allocation_units wydają się raportować przestrzeń faktycznie używaną przez skompresowane dane.
Oczywiście serwer aplikacji pracuje z nieskompresowanymi danymi, więc rozmiar danych na dysku w SQL Server jest nieistotny. Potrzebuję rzeczywistego rozmiaru, jaki będą miały nieskompresowane dane.
Wiem o sp_estimate_data_compression_savings, ale jak sama nazwa wskazuje, to tylko szacunek.
Wolałbym mieć jak najbardziej poprawny rozmiar.
Jedynym sposobem, w jaki mogłem wymyślić, był jakiś zawiły dynamiczny SQL tworzący nieskompresowane tabele o tej samej strukturze co skompresowane tabele, wstawiający skompresowane dane do tej tabeli cienia, a następnie sprawdzający rozmiar tej tabeli cienia.
Nie trzeba dodawać, że jest to nieco żmudne i zajmuje trochę czasu, aby uruchomić bazę danych zawierającą kilkaset GB.
Powershell może być opcją, ale nie chciałbym iterować po wszystkich tabelach, aby wykonać select *
na nich sprawdzanie rozmiaru skryptu, ponieważ to po prostu zalałoby pamięć podręczną i prawdopodobnie zabrałoby to również dużo czasu.
Krótko mówiąc, potrzebuję sposobu, aby uzyskać rozmiar dla każdej tabeli, ponieważ będzie ona raz nieskompresowana, a fragmentacja poza równaniem przedstawionym aplikacji, jeśli to możliwe. Jestem otwarty na różne podejścia, preferowany jest T-SQL, ale nie jestem przeciwny Powershellowi ani innym kreatywnym podejściom.
Załóżmy, że bufor w aplikacji ma rozmiar danych. Bigint ma zawsze rozmiar biginta, a typ danych znakowych to 2 bajty na znak (Unicode). Dane BLOB również przyjmują rozmiar danych, wyliczenie jest zasadniczo liczbą całkowitą, a dane liczbowe są liczbowe (38,12), a data-godzina jest wielkością godziny / godziny. Ponadto nie ma żadnych NULL
wartości, są one przechowywane jako pusty ciąg 1900-01-01
lub zero.
Nie ma dokumentacji dotyczącej tego, jak jest to realizowane, ale założenia są oparte na niektórych testach i skryptach używanych przez PFE i zespół wsparcia (które również najwyraźniej ignorują kompresję, ponieważ kontrola jest wbudowana w aplikację, a aplikacja nie może powiedzieć jeśli podstawowe dane są skompresowane), które również sprawdzają rozmiary tabel. Ten link na przykład stwierdza:
Unikaj używania pamięci podręcznej EntireTable dla dużych tabel (w AX 2009 ponad 128 KB lub 16 stron, w AX 2012 w ustawieniach aplikacji „rozmiar całej pamięci podręcznej tabeli” (domyślnie: 32 KB lub 4 strony)) - zamiast tego przejdź do zapisywania buforowania.