Di Dynamics AX ada mekanisme caching di mana tabel dapat dikonfigurasi untuk dimuat ke dalam memori dan di-cache. Cache ini terbatas pada jumlah tertentu dari KB untuk mencegah masalah memori. Pengaturan yang saya bicarakan dipanggil entiretablecache
dan memuat seluruh tabel dalam memori segera setelah satu catatan diminta.
Hingga baru-baru ini kami mengandalkan beberapa skrip untuk memverifikasi ukuran tabel yang memiliki pengaturan ini untuk melihat apakah ukuran tabel di atas batas ini.
Namun sekarang, kompresi ikut berperan dan hal-hal seperti sp_spaceused atau sys.allocation_units tampaknya melaporkan ruang yang sebenarnya digunakan oleh data terkompresi.
Jelas, server aplikasi bekerja dengan data yang tidak terkompresi sehingga ukuran data pada disk di SQL Server tidak relevan. Saya membutuhkan ukuran sebenarnya dari data yang tidak terkompresi.
Saya tahu sp_estimate_data_compression_savings tetapi seperti namanya, ini hanya perkiraan.
Saya lebih suka memiliki ukuran yang setepat mungkin.
Satu-satunya cara saya bisa memikirkan adalah beberapa SQL dinamis yang berbelit-belit membuat tabel terkompresi dengan struktur yang sama dengan tabel terkompresi, memasukkan data terkompresi dalam tabel bayangan itu dan kemudian memeriksa ukuran tabel bayangan itu.
Tak perlu dikatakan, ini agak membosankan dan perlu beberapa saat untuk berjalan pada database beberapa ratus GB.
Powershell bisa menjadi pilihan, tapi saya tidak ingin mengulangi semua tabel untuk melakukan select *
pada mereka untuk memeriksa ukuran dalam skrip karena itu hanya akan membanjiri cache dan mungkin akan memakan waktu lama juga.
Singkatnya, saya butuh cara untuk mendapatkan ukuran untuk setiap tabel karena akan pernah terkompresi dan dengan fragmentasi keluar dari persamaan seperti yang disajikan ke aplikasi, jika itu mungkin. Saya terbuka untuk pendekatan yang berbeda, T-SQL lebih disukai tetapi saya tidak menentang Powershell atau pendekatan kreatif lainnya.
Asumsikan buffer dalam aplikasi adalah ukuran data. Bigint selalu berukuran bigint, dan tipe data karakter adalah 2 byte per karakter (unicode). Data BLOB mengambil ukuran data juga, enum pada dasarnya adalah int dan data numerik adalah numerik (38,12), datetime adalah ukuran datetime. Juga, tidak ada NULL
nilai, mereka disimpan sebagai string kosong, 1900-01-01
atau nol.
Tidak ada dokumentasi tentang bagaimana ini diterapkan, tetapi asumsi didasarkan pada beberapa pengujian dan skrip yang digunakan oleh PFE dan tim dukungan (yang juga mengabaikan kompresi tampaknya, karena cek dibangun dalam aplikasi dan aplikasi tidak dapat memberitahu jika data yang mendasarinya dikompresi) yang juga memeriksa ukuran tabel. Tautan ini misalnya menyatakan:
Hindari menggunakan cache Seluruh Tabel untuk tabel besar (di AX 2009 lebih dari 128 KB atau 16 halaman, di AX 2012 atas pengaturan aplikasi 'seluruh tabel ukuran cache' [default: 32KB, atau 4 halaman]) - alih-alih pindah ke caching rekaman.