## Kedy použiť Pri plánovaní kapacity diskov a záloh, pred obnovou licencie úložiska alebo keď sa pýtajú „ako rýchlo nám rastie databáza?“. ## Ako čítať výsledok Prvá sada: databáza × mesiac – najväčšia FULL záloha v mesiaci (`backup_mb`, `compressed_mb`) a rozdiel oproti predošlému mesiacu. Druhá sada: súhrn na databázu – prvý a posledný mesiac a `avg_growth_mb_per_month`. `backup_size` je objem dát v zálohe (použité stránky), nie veľkosť MDF súborov – voľné miesto vo vnútri súborov sa nepočíta. > [!WARNING] > Výsledok je len taký dlhý, ako dlho msdb drží históriu (`sp_delete_backuphistory`, údržbové plány a Ola to pravidelne mažú). Mesiace bez FULL zálohy chýbajú. Jednorazový veľký import alebo archivácia skreslí priemer – pozri aj mesačné rozdiely. **Oprávnenia:** Čítanie `msdb.dbo.backupset` (napr. `db_datareader` v msdb). **Režim:** READ ONLY · **Verzia:** SQL Server 2016 – 2022 ## Súvisiace recepty - [Veľkosť databáz a dátových súborov](script.php?id=2&s=velkost-databaz-a-datovych-suborov) - [História záloh – typ, veľkosť, kompresia, súbor](script.php?id=31&s=historia-zaloh-typ-velkost-kompresia-subor) ## Zdroje - [backupset (msdb)](https://learn.microsoft.com/en-us/sql/relational-databases/system-tables/backupset-transact-sql) _Skript je staticky overený proti dokumentácii Microsoft Learn (názvy DMV, stĺpcov a hodnôt), nie spustený na živom serveri. Pred použitím na PROD ho vyskúšaj na TEST._
Rast databáz podľa záloh (12 mesiacov)
Mesačná veľkosť FULL záloh každej databázy z msdb a priemerný rast v MB za mesiac – podklad na plánovanie disku bez monitoringu.
/* DeadlockCafe | Rast databáz podľa záloh (12 mesiacov)
Účel: Mesačná veľkosť FULL záloh každej databázy z msdb a priemerný rast v MB za mesiac – podklad na plánovanie disku bez monitoringu.
Režim: READ ONLY | SQL Server 2016 – 2022, on-premises
*/
SET NOCOUNT ON;
DECLARE @Months int = {{Months:12|Koľko mesiacov dozadu}};
DECLARE @from date = DATEADD(MONTH, 1 - @Months, DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1));
IF OBJECT_ID(N'tempdb..#m') IS NOT NULL DROP TABLE #m;
SELECT b.database_name,
DATEFROMPARTS(YEAR(b.backup_start_date), MONTH(b.backup_start_date), 1) AS month_start,
COUNT(*) AS full_backups,
MAX(b.backup_size) AS max_backup_bytes,
MAX(b.compressed_backup_size) AS max_compressed_bytes
INTO #m
FROM msdb.dbo.backupset AS b
WHERE b.type = 'D'
AND b.backup_start_date >= @from
GROUP BY b.database_name, DATEFROMPARTS(YEAR(b.backup_start_date), MONTH(b.backup_start_date), 1);
-- 1) databáza × mesiac
SELECT database_name,
CONVERT(char(7), month_start, 120) AS [month],
full_backups,
CAST(max_backup_bytes / 1048576.0 AS decimal(18,1)) AS backup_mb,
CAST(max_compressed_bytes / 1048576.0 AS decimal(18,1)) AS compressed_mb,
CAST((max_backup_bytes - LAG(max_backup_bytes) OVER (PARTITION BY database_name ORDER BY month_start))
/ 1048576.0 AS decimal(18,1)) AS growth_mb_vs_prev_month
FROM #m
ORDER BY database_name, month_start;
-- 2) súhrn na databázu
;WITH e AS
(
SELECT database_name, month_start, max_backup_bytes,
ROW_NUMBER() OVER (PARTITION BY database_name ORDER BY month_start) AS rn_first,
ROW_NUMBER() OVER (PARTITION BY database_name ORDER BY month_start DESC) AS rn_last
FROM #m
)
SELECT f.database_name,
CONVERT(char(7), f.month_start, 120) AS first_month,
CONVERT(char(7), l.month_start, 120) AS last_month,
CAST(f.max_backup_bytes / 1048576.0 AS decimal(18,1)) AS first_mb,
CAST(l.max_backup_bytes / 1048576.0 AS decimal(18,1)) AS last_mb,
CAST((l.max_backup_bytes - f.max_backup_bytes) / 1048576.0
/ NULLIF(DATEDIFF(MONTH, f.month_start, l.month_start), 0) AS decimal(18,1)) AS avg_growth_mb_per_month
FROM e AS f
JOIN e AS l ON l.database_name = f.database_name AND l.rn_last = 1
WHERE f.rn_first = 1
ORDER BY avg_growth_mb_per_month DESC;