Estimating the data size in your Business Central online tenant
In the online version of Business Central, data is compressed using the SQL Server data compression feature. As a consequence, the data size in your on-premises database might not match the data size when migrated to the Business Central service.
Currently, all tables in the online version of Business Central are compressed with CompressionType set to Page.
To evaluate whether a table is a good candidate to compress, you can use the stored procedure sp_estimate_data_compression_savings
in SQL Server. For more information, see sp_estimate_data_compression_savings (Transact-SQL).
Note
The stored procedure sp_estimate_data_compression_savings
fails if the table has columns with &
in the name.
If you want to estimate the compressed size of all or some tables in your database, you can create (and possibly modify) the following stored procedure:
CREATE PROCEDURE estimate_page_compressed_table_sizes
AS
SET NOCOUNT ON
BEGIN
DECLARE @table_name sysname;
CREATE TABLE #compressed_table_report (
table_name sysname,
schema_name nvarchar(max),
index_id int,
partition_number int,
size_with_current_compression_setting bigint,
size_with_requested_compression_setting bigint,
sample_size_with_current_compression_setting bigint,
sample_size_with_requested_compression_setting bigint
);
DECLARE tables_cur cursor for
SELECT name
FROM sys.tables
-- uncomment and adjust this part if you want to only include some tables in the calculation
-- WHERE name IN ('table name 1', 'table name 2', 'table name 3')
--
-- uncomment and adjust this part if you want to restrict the tables in the calculation
-- WHERE name NOT IN ('table name 1', 'table name 2', 'table name 3')
;
OPEN tables_cur;
FETCH NEXT FROM tables_cur INTO @table_name
WHILE @@Fetch_Status = 0
BEGIN
INSERT INTO #compressed_table_report
EXEC sp_estimate_data_compression_savings
@schema_name = 'dbo', -- Business Central use the dbo schema
@object_name = @table_name,
@index_id = NULL,
@partition_number = NULL,
@data_compression = 'PAGE'
;
FETCH NEXT FROM tables_cur INTO @table_name
END;
CLOSE tables_cur;
DEALLOCATE tables_cur;
SELECT table_name
, avg(size_with_current_compression_setting) as avg_size_with_current_compression_setting_KB
, avg(size_with_requested_compression_setting) as avg_size_with_requested_compression_setting_KB
, avg(size_with_current_compression_setting - size_with_requested_compression_setting) AS avg_size_saving_KB
FROM #compressed_table_report
GROUP BY table_name
ORDER BY avg_size_saving_KB DESC
;
DROP TABLE #compressed_table_report
;
END
SET NOCOUNT OFF
GO
To run the stored procedure, execute the following commands:
USE <tenant database> // change to your database
GO
EXEC estimate_page_compressed_table_sizes
GO
The stored procedure sp_estimate_data_compression_savings
fails if the table has columns with &
in the name. With the following query, you can find the table names that should be excluded in definition of the stored procedure estimate_page_compressed_table_sizes
.
SELECT t.name AS table_name,
, ind.name AS index_name,
, col.name AS column_ame
FROM sys.indexes ind
INNER JOIN sys.index_columns ic ON ind.object_id = ic.object_id AND ind.index_id = ic.index_id
INNER JOIN sys.columns col ON ic.object_id = col.object_id AND ic.column_id = col.column_id
INNER JOIN sys.tables t ON ind.object_id = t.object_id
WHERE col.name LIKE '%&%'