У Dynamics AX існує механізм кешування, за допомогою якого таблиці можуть бути налаштовані для завантаження в пам'ять і кешування. Цей кеш обмежений певною кількістю КБ, щоб запобігти проблемам із пам'яттю. Налаштування, про яке я говорю, викликається entiretablecache
і завантажує всю таблицю в пам'ять, як тільки запитається один запис.
До недавнього часу ми покладалися на деякі сценарії, щоб перевірити розмір таблиць, у яких є це налаштування, щоб побачити, чи розмір таблиці перевищує цю межу.
Однак тепер компресія вступає в гру і такі речі, як sp_spaceused або sys.allocation_units, здається, повідомляють про простір, який фактично використовується стислими даними.
Очевидно, сервер додатків працює з нестисненими даними, тому розмір даних на диску в SQL Server не має значення. Мені потрібен фактичний розмір, який матимуть нестиснені дані.
Я знаю sp_estimate_data_compression_savings, але, як випливає з назви, це лише оцінка.
Я вважаю за краще, щоб розмір був максимально правильним.
Єдиний спосіб, що я міг придумати, - це якийсь перекручений динамічний SQL, який створює нестиснені таблиці з тією ж структурою, що і стислі таблиці, вставляючи стислі дані в цю тіньову таблицю і перевіряючи розмір цієї тіньової таблиці.
Потрібно говорити, що це трохи втомлює і потребує певного часу, щоб працювати на базі даних в кілька сотень ГБ.
Powershell може бути варіантом, але я не хотів би переглядати всі таблиці, щоб виконати select *
на них, щоб перевірити розмір сценарію, тому що це просто затопить кеш і, ймовірно, теж зайняє багато часу.
Коротше кажучи, мені потрібен спосіб отримати розмір для кожної таблиці, оскільки вона буде колись нестиснутою та з фрагментацією з рівняння, як це подано в програмі, якщо це можливо. Я відкритий для різних підходів, T-SQL є кращим, але я не проти Пауершелла чи інших творчих підходів.
Припустимо, буфер в додатку - це розмір даних. Bigint - це завжди розмір bigint, а тип даних символів - 2 байти на символ (unicode). Дані BLOB також приймають розмір даних, перерахунок - це, в основному, int, а числові дані - числові (38,12), datetime - це розмір дати. Також NULL
значень немає , вони або зберігаються як порожній рядок, 1900-01-01
або нуль.
Немає документації про те, як це реалізується, але припущення засновані на деякому тестуванні та сценаріях, які використовуються PFE та командою підтримки (яка також ігнорує стиснення, мабуть, оскільки перевірка вбудована в додаток, і додаток не може визначити якщо базові дані стиснуті), які також перевіряють розміри таблиці. Наприклад, у цьому посиланні зазначено:
Уникайте використання кеш-файлів EntireTable для великих таблиць (в AX 2009 понад 128 Кб або 16 сторінок, в AX 2012 над налаштуваннями програми «Весь розмір кеша таблиці» [за замовчуванням: 32 КБ або 4 сторінки]) - замість цього перейдіть до запису кешування.