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