Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да автоматизирате събирането на данни за растежа на базата данни на SQL Server

Въведение

Често има нужда да се контролира растежа на всички таблици и файлове на всички бази данни.

В тази статия ще разгледаме пример за това как да автоматизираме събирането на данни за нарастването на таблици и файлове на база данни на SQL Server.

Решение

  1. Създайте изглед за размера на всички таблици за всяка база данни
    ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE изглед [inf].[vTableSize] като pagesize KB като ( SELECT low / 1024 като PageSizebo. FROM master. spt_values ​​WHERE номер =1 И тип ='E'),f_size като ( изберете p.[object_id], sum([total_pages]) като TotalPageSize, sum([used_pages]) като UsedPageSize, sum([data_pages]) като DataPageSize от DataPageSize от sys.partitions p join sys.allocation_units a на p.partition_id =a.container_id left join sys.internal_tables го на p.object_id =it.object_id WHERE OBJECTPROPERTY(p.[object_id], N'IsUserTable') =1 група от p. .[object_id]),tbl като ( SELECT t.[schema_id], t.[object_id], i1.rowcnt като CountRows, (COALESCE(SUM(i1.reserved), 0) + COALESCE(SUM(i2.reserved),)). 0)) * (изберете отгоре(1) PageSizeKB от pagesizeKB) като ReservedKB, (COALESCE(SUM(i1.dpages), 0) + COALESCE(SUM(i2.used), 0)) * (изберете отгоре(1) PageSizeKB от pagesizeKB) като DataKB, ((COALESCE(SUM(i 1.използван), 0) + КОАЛЕСЦИЯ(SUM(i2.used), 0)) - (COALESCE(SUM(i1.dpages), 0) + COALESCE(SUM(i2.used), 0))) * (изберете top(1) PageSizeKB от pagesizeKB) като IndexSizeKB, ((COALESCE(SUM(i1.reserved), 0) + COALESCE(SUM(i2.reserved), 0)) - (COALESCE(SUM(i1.used), 0) + COALESCE(SUM(i2.used), 0))) * (изберете top(1) PageSizeKB от pagesizeKB) като UnusedKB FROM sys.tables като t LEFT OUTER JOIN sysindexes като i1 ON i1.id =t.[object_id] И ИД. i1.indid <2 LEFT OUTER JOIN системни индекси като i2 ON i2.id =t.[object_id] И i2.indid =255 WHERE OBJECTPROPERTY(t.[object_id], N'IsUserTable') =1 ИЛИ (OBJECTPROPERTY(t.[). object_id], N'IsView') =1 И OBJECTPROPERTY(t.[object_id], N'IsIndexed') =1) GROUP BY t.[schema_id], t.[object_id], i1.rowcnt)SELECT @@Servername AS AS. Сървър, DB_NAME() КАТО DBName, SCHEMA_NAME(t.[schema_id]) като SchemaName, OBJECT_NAME(t.[object_id]) като TableName, t.CountRows, t.ReservedKB, t.DataKB, t.IndexSizeKB, t.Unused KB, f.TotalPageSize*(изберете top(1) PageSizeKB от pagesizeKB ) като TotalPageSizeKB, f.UsedPageSize*(изберете top(1) PageSizeKB от pagesizeKB) като UsedPageSizeKB, f.DataPageSize*(изберете отгоре(1) PageSizeKB от pagesizeKB) като DataPageSizeKBFROM f_size като finner join tbl като обект_обект_на tbl. =f.[object_id]GO
  2. Създайте конкретна база данни и определете таблица за съхраняване на информация за растежа на всички таблици на базата данни:
    ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [srv].[TableStatistics]( [Row_GUFIIDer]( [Row_GUFIIDer]) ] НЕ НУЛЕВО ОГРАНИЧЕНИЕ [DF_TableStatistics_Row_GUID] ПО ПОДРАЗБИРАНЕ (newid()), [ServerName] [nvarchar](255) НЕ NULL, [DBName] [nvarchar](255) NOT NULL, [SchemaName] [nvarchar](255, NOT) [Име на таблица] [nvarchar](255) NOT NULL, [CountRows] [bigint] NOT NULL, [DataKB] [int] NOT NULL, [IndexSizeKB] [int] NOT NULL, [UnusedKB] [int] NOT NULL, [ReservedKB ] [int] NOT NULL, [InsertUTCDate] [datetime] NOT NULL ОГРАНИЧЕНИЕ [DF_TableStatistics_InsertUTCDate] ПО ПОДРАЗБИРАНЕ (getutcdate()), [Date] AS (CONVERT([date], [InsertUTCDate])) УСТАНОВИ, [CountRowstBack] NULL, [CountRowsNext] [bigint] NULL, [DataKBBack] [int] NULL, [DataKBNext] [int] NULL, [IndexSizeKBBack] [int] NULL, [IndexSizeKBNext] [int] NULL, [UnusedKBBack] [int] , [UnusedKBNext] [int] NULL, [ReservedKBBack] [int] NULL, [ReservedKBNext] [int] NULL, [AvgCountRows] AS (([CountRowsBack]+[CountRows])+[CountRowsNext])/(3)) УСТОЙЧИВО, [AvgDataKB] КАТО ((([DataKBBack]+[DataKB])+[DataKBNext])/(3)) УСТОЙЧИВО, [AvgIndexSizeKB] КАТО ((([IndexSizeKBBack]+[IndexSizeKB])+[IndexSize]KBNext (3)) ПРОСТОЯВА, [AvgUnusedKB] КАТО ((([UnusedKBBack]+[UnusedKB])+[UnusedKBNext])/(3)) ПОСТОЙНО, [AvgReservedKB] AS ((([ReservedKBBack]+[ReservedKB])+[ ReservedKBNext])/(3)) ПОСТОЙНО, [DiffCountRows] КАТО (([CountRowsNext]+[CountRowsBack])-(2)*[CountRows]) ПОСТОЯНО, [DiffDataKB] КАТО (([DataKBNext]+[DataKBBack])- (2)*[DataKB]) ПРОСТОЯВА, [DiffIndexSizeKB] КАТО (([IndexSizeKBNext]+[IndexSizeKBBack])-(2)*[IndexSizeKB]) УПОРАЖАВА, [DiffUnusedKB] КАТО (([UnusedKBNext]+])-UnusedKBBack (2)*[UnusedKB]) ПРОСТОЯВА, [DiffReservedKB] КАТО (([ReservedKBNext]+[ReservedKBBack])-(2)*[ReservedKB]) ПОСТОЯНА, [TotalPageSizeKB] [int] NULL, [TotalPageSizeKBBack] [int] NULL , [TotalPageSizeKBNext] [int] NULL, [UsedPageSizeKB] [int] NULL, [UsedPageSizeKBBack] [int] NULL, [UsedPageSizeKBNext] [int] NULL, [DataPageSizeKB] [int] NULL, [DataPageSizeKBBack] [int] NULL, [int] NULL, [DaNexKB ] Null, [avgdatapagesizekb] като (([[dataPageSizekbback]+[dataPageSizekb])+[dataPageSizekBnext])/(3)) persisted, [avgusedPageSizekb] като (([usedPageSizekback]+[ascypageSizekb])+[usepagesizekbnext]) /(3)) ПРОСТОЯВА, [AvgTotalPageSizeKB] КАТО ((([TotalPageSizeKBBack]+[TotalPageSizeKB])+[TotalPageSizeKBNext])/(3)) УСТОЙЧИВА, [DiffDataPageSizeKB] КАТО (([DataPageSizeKBNext]-([DataPageSizeKBNext]-([DataPageSizeKBNext])-([DataPageSizeKBNext] 2)*[DataPageSizeKB]) PERSISTED,--показва при промяна на кастинга [DiffUsedPageSizeKB] AS (([UsedPageSizeKBNext]+[UsedPageSizeKBBack])-(2)*[UsedPageSizeKB]) PERSISTED,--показва се при промяна на кастинга [DiffTotalPageSizeKB] AS (([TotalPageSizeKBNext]+[TotalPageSizeKBBack])-(2)*[TotalPageSizeKB]) PERSISTED,--показва при промяна на кастинга ОГРАНИЧЕНИЕ [PK_TableStatistics] PRIMARY KEY CLUSTERED ( [Row_GUID] )С (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY]GOSET ANSI_PADDING ONGO 

    TotalPageSizeKB указва размера на таблицата.

    Общата сума на TotalPageSizeKB от всички таблици на базата данни + размерът на системните таблици =размерът на данните от базата данни.

  3. Определете процедурата за събиране на информацията:
    ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[InsertTableStatistics]ASBEGIN SET NOCOUNT ON; ЗАДАВАНЕ НА НИВОТО НА ИЗОЛАЦИЯ НА ТРАНЗАКЦИЯТА ПРОЧЕТЕНЕ НЕЗАДЪЛЖЕНО; декларира @dt дата=CAST(GetUTCDate() като дата); декларира @dbs nvarchar(255); декларира @sql nvarchar(max); изберете [име] в #dbs от sys.databases; while(exists(select top(1) 1 from #dbs)) start select top(1) @dbs=[name] from #dbs; set @sql=N'INSERT INTO [srv].[TableStatistics] ([ServerName] ,[DBName] ,[SchemaName] ,[TableName] ,[CountRows] ,[DataKB] ,[IndexSizeKB]) ,[UnusedKB] ,[ReservedKB] ,[ReservedKB] ] ,[TotalPageSizeKB] ,[UsedPageSizeKB] ,[DataPageSizeKB]) SELECT [Server] ,[DBName] ,[SchemaName] ,[TableName] ,[CountRows] ,[DataKB] ,[IndexSizeKB] ,[Unused KB] ,[Unused KB ,[TotalPageSizeKB] ,[UsedPageSizeKB] ,[DataPageSizeKB] ОТ ['[email protected]+'].[inf].[vTableSize];'; exec sp_executesql @sql; изтрийте от #dbs, където [име][email protected]; крайна изпускаща таблица #dbs; декларира @dt_back дата=CAST(DateAdd(day,-1,@dt) като дата);;с tbl1 като ( изберете [Date], [CountRows], [DataKB], [IndexSizeKB], [UnusedKB], [ReservedKB], [ServerName], [DBName], [SchemaName], [TableName], [TotalPageSizeKB], [UsedPageSizeKB], [DataPageSizeKB] от [srv].[TableStatistics] където [Date][email protected]_back ) , tbl2 като ( изберете [Дата], [CountRows], [CountRowsBack], [DataKBBack], [IndexSizeKBBack], [UnusedKBBack], [ReservedKBBack], [ServerName], [DBName], [SchemaName], [TableName], [TotalPageSizeKBBack], [UsedPageSizeKBBack], [DataPageSizeKBBack] от [srv].[TableStatistics] където [Dateq]ldexample@Dateq] .com ) актуализация t2 set t2.[CountRowsBack] =t1.[CountRows], t2.[DataKBBack] =t1.[DataKB], t2.[IndexSizeKBBack] =t1.[IndexSizeKB], t2.[UnusedKBBack] =t1. [UnusedKB], t2.[ReservedKBBack] =t1.[ReservedKB], t2.[TotalPageSizeKBBack]=t1.[TotalPageSizeKB], t2.[UsedPageSizeKBBack] =t1.[UsedPageSiziz. eKB], t2.[DataPageSizeKBBack] =t1.[DataPageSizeKB] от tbl1 като t1 вътрешно присъединяване tbl2 като t2 на t1.[Date]=DateAdd(day,-1,t2.[Date]) и t1.[ServerName]=t2.[Име на сървър] и t1.[Име на DB]=t2.[Име на DB] и t1.[Име на схема]=t2.[Име на схема] и t1.[Име на таблица]=t2.[Име на таблица];;с tbl1 като ( изберете [Дата], [CountRows], [CountRowsNext], [DataKBNext], [IndexSizeKBNext], [UnusedKBNext], [ReservedKBNext], [ServerName], [DBName], [SchemaName], [T [TotalPageSizeKBNext], [UsedPageSizeKBNext], [DataPageSizeKBNext] от [srv].[TableStatistics] където [Date][email protected]_back) , tbl2 като ( изберете [Date], [CountRows], [DataxSKB], [Inde], [Inde] [UnusedKB], [ReservedKB], [ServerName], [DBName], [SchemaName], [TableName], [TotalPageSizeKB], [UsedPageSizeKB], [DataPageSizeKB] от [srv].[TableStatistics], където [Date]example@sqldat] .com ) актуализация t1 задава t1.[CountRowsNext] =t2.[CountRows], t1.[DataKBNext] =t2.[DataKB], t1.[IndexSizeKBNext] =t2.[IndexSizeKB], t1.[Unused KBNext] =t2. [UnusedKB], t1.[ReservedKBNext] =t2.[ReservedKB], t1.[TotalPageSizeKBNext]=t2.[TotalPageSizeKB], t1.[UsedPageSizeKBNext] =t2.[UsedPageSiziz. eKB], t1.[DataPageSizeKBNext] =t2.[DataPageSizeKB] от tbl1 като t1 вътрешно присъединяване tbl2 като t2 на t1.[Date]=DateAdd(day,-1,t2.[Date]) и t1.[ServerName]=t2.[Име на сървъра] и t1.[Име на DB]=t2.[Име на DB] и t1.[Име на схема]=t2.[Име на схема] и t1.[Име на таблица]=t2.[Име на таблица];ENDGO

    Това решение може да бъде модифицирано, за да събира данни за размерите на таблиците на всички бази данни от всички необходими копия на MS SQL Server.

  4. Дефинирайте изгледа според събраната информация:
    ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOсъздайте изглед [srv].[vTableStatisticsShort] като с d as (изберете DateAdd(day,-1,max([Date])) ) като [Дата] от [srv].[TableStatistics])SELECT t.[Име на сървър] ,t.[DBName] ,t.[SchemaName] ,t.[Име на таблица] ,t.[CountRows] ,t.[DataKB] ,t.[IndexSizeKB] ,t.[UnusedKB] ,t.[ReservedKB] ,t.[InsertUTCDate] ,t.[Date] ,t.[CountRowsBack] ,t.[CountRowsNext] ,t.[DataKBBack] ,t.[DataKBBack] .[DataKBNext] ,t.[IndexSizeKBBack] ,t.[IndexSizeKBNext] ,t.[UnusedKBNext] ,t.[UnusedKBNext] ,t.[ReservedKBBack] ,t.[ReservedKBNext] ,t.[AvgCountRows] ,t.[AvgCountRows] ,t.[AvgCountRows]. AvgDataKB] ,t.[AvgIndexSizeKB] ,t.[AvgUnusedKB] ,t.[AvgReservedKB] ,t.[DiffCountRows] ,t.[DiffDataKB] ,t.[DiffIndexSizeKB] ,t.[DiffUnusedKB] ,t]. ,t.[TotalPageSizeKB] ,t.[TotalPageSizeKBBack] ,t.[TotalPageSizeKBNext] ,t.[UsedPageSizeKB] ,t.[UsedPageSizeKBBack] ,t.[UsedPageSizeKBNext] ,t.[DataPageSizeKB] ,t.[DataPageSizeKBBack] ,t.[DataPageSizeKBBack] ,t.[DataPageSizeKBNext] ,t.[DataPageSizeKBNext][t]gDa KBNext.[t]gDa KBNext. .[AvgUsedPageSizeKB] ,t.[AvgTotalPageSizeKB] ,t.[DiffDataPageSizeKB] ,t.[DiffUsedPageSizeKB] ,t.[DiffTotalPageSizeKB] FROM d вътрешно присъединяване [SRV].[srv].[TableStatistics] като t на d.[Date] ]=t.[Дата], където t.[CountRowsBack] не е нула, а t.[CountRowsNext] не е nullGO

    Тук бих искал да насоча вниманието ви към Diff. Ако е по-високо от 0, това означава, че таблицата расте по-бързо всеки ден.

    Събирането трябва да се прави веднъж на всеки 24 часа.

    По същия начин можем да автоматизираме събирането на растежа на файловете на всички бази данни, като използваме следния изглед:

    ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOизберете t2.[DB_Name] като [DBName] ,t1.FileId ,t1.NumberReads ,t1.BytesRead ,t1.BytesRead ,t1.BytesRead ,t1.BytesRead,t1.IomberRead,t1.IomberRead,t1. t1.IoStallMS ,t1.BytesOnDisk ,t1.[TimeStamp] ,t1.FileHandle ,t2.[Type_desc] ,t2.[FileName] ,t2.[Drive] ,t2.[Physical_Name] ,t2.[Ext] ,t2. [CountPage] ,t2.[SizeMb] ,t2.[SizeGb] ,t2.[Растеж] ,t2.[GrowthMb] ,t2.[GrowthGb] ,t2.[Процент на растеж] ,t2.[is_percent_growth] ,t2.[идентификатор на база_данни] ] ,t2.[State] ,t2.[StateDesc] ,t2.[IsMediaReadOnly] ,t2.[IsReadOnly] ,t2.[IsSpace] ,t2.[IsNameReserved] ,t2.[CreateLsn] ,t2.[DropLsn] t2.[ReadOnlyLsn] ,t2.[ReadWriteLsn] ,t2.[DifferentialBaseLsn] ,t2.[DifferentialBaseGuid] ,t2.[DifferentialBaseTime] ,t2.[RedoStartLsn] ,t2,[RedoStartForkGuid] ,t2.[RedoStartForkGuid]. [RedoTargetForkGuid] ,t2.[BackupLsn]от fn_virtualfilestats(NULL, NULL) като t1inner join [inf].[Serv]. erDBFileInfo] като t2 на t1.[DbId]=t2.[database_id] и t1.[FileId]=t2.[File_Id]GO

Резултат

В тази статия проучихме примера за автоматизирано събиране на данни за размера и растежа на всички таблици и файлове на SQL Server на всички бази данни. Той ни предоставя пълния контрол върху промяната на размера както на файловете на базата данни, така и на нейните таблици, както и предприемане на навременни мерки за намаляване на таблицата или файла, за увеличаване на устройството за съхранение на данни или за разделяне на информация на множество устройства за съхранение на данни.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Кой е най-добрият начин за създаване и попълване на таблица с числа?

  2. Преобразувайте името на месеца в номера на месеца в SQL Server (T-SQL)

  3. Вмъкнете картина в полето за изображение на SQL Server 2005, като използвате само SQL

  4. Вместо тригер в SQL Server губи SCOPE_IDENTITY?

  5. Преструктуриране и реорганизиране на индекса на SQL Server