परिचय
अक्सर, सभी तालिकाओं और सभी डेटाबेस की फ़ाइलों की वृद्धि को नियंत्रित करने की आवश्यकता होती है।
इस लेख में, हम SQL सर्वर डेटाबेस तालिकाओं और फ़ाइलों के विकास पर डेटा संग्रह को स्वचालित करने के तरीके का एक उदाहरण तलाशने जा रहे हैं।
समाधान
- प्रत्येक डेटाबेस के लिए सभी तालिकाओं के आकार के बारे में एक दृश्य बनाएं
उपयोग करें [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE दृश्य [inf]।[vTableSize] साथ में pageizeKB as (मास्टर.dbo से PageSizeKB के रूप में कम / 1024 चुनें। spt_values जहां संख्या =1 और प्रकार ='ई'), f_size के रूप में (p.[object_id], योग ([total_pages]) को TotalPageSize के रूप में, योग ([used_pages]) के रूप में UsePageSize, sum ([data_pages]) को DataPageSize के रूप में चुनें। sys.partitions p sys.allocation_units a पर p.partition_id =a.container_id बाएं शामिल हों sys.internal_tables इसे p.object_id =it.object_id पर शामिल करें जहां OBJECTPROPERTY(p.[object_id], N'IsUserTable') =1 समूह द्वारा p .[object_id]),tbl as ( SELECT t.[schema_id], t.[object_id], i1.rowcnt as CountRows, (COALESCE(SUM(i1.reserved), 0) + COALESCE(SUM(i2.reserved), 0)) * (शीर्ष का चयन करें(1) PageSizeKB से PageSizeKB) आरक्षित KB के रूप में, (COALESCE(SUM(i1.dpages), 0) + COALESCE(SUM(i2.used), 0)) * (शीर्ष चुनें(1) PageSizeKB) pagesizeKB से) DataKB के रूप में, ((COALESCE(SUM(i .) 1. उपयोग किया गया), 0) + COALESCE(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))) * (पेजसाइजकेबी से टॉप(1) पेजसाइजकेबी का चयन करें) अप्रयुक्तकेबी के रूप में sys.tables से टी बाएं बाहरी sysindexes को i1 पर i1.id =t.[object_id] के रूप में शामिल करें और i1.indid <2 बाएं बाहरी sysindexes को i2 पर i2.id =t. [object_id] और i2.indid =255 के रूप में शामिल करें जहां 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) @@Servername AS चुनें सर्वर, DB_NAME() AS DBName, SCHEMA_NAME(t.[schema_id]) स्कीमानाम के रूप में, OBJECT_NAME(t.[object_id]) टेबलनेम के रूप में, t.CountRows, t.ReservedKB, t.DataKB, t.IndexSizeKB, t.UnusedKB, f.TotalPageSize*(शीर्ष का चयन करें(1) PageSizeKB से pageizeKB ) TotalPageSizeKB के रूप में, f.UsedPageSize*(सेलेक्ट टॉप(1) PageSizeKB से PageSizeKB) यूज्डPageSizeKB के रूप में, f.DataPageSize* (सेलेक्ट टॉप(1) PageSizeKB पेजसाइजकेबी से) DataPageSizeKBF_size के रूप में f_size के रूप में f_size के रूप में t पर t पर t के रूप में शामिल हों।[object_id] =f.[object_id]जाओ
- एक विशिष्ट डेटाबेस बनाएं और सभी डेटाबेस तालिकाओं के विकास के बारे में जानकारी संग्रहीत करने के लिए एक तालिका निर्धारित करें:
उपयोग [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [srv]। ] पूर्ण बाधा नहीं [DF_TableStatistics_Row_GUID] DEFAULT (newid ()), [सर्वरनाम] [nvarchar] (255) न्यूल नहीं, [DBName] [nvarchar] (255) न्यूल नहीं, [स्कीमानाम] [nvarchar] (255) न्यूल नहीं, [टेबलनाम] [नवरचर] (255) नॉट न्यूल, [काउंटरो] [बिगिन्ट] नॉट न्यूल, [डेटाकेबी] [इंट] नॉट न्यूल, [इंडेक्ससाइजकेबी] [इंट] नॉट न्यूल, [अप्रयुक्त केबी] [इंट] नॉट न्यूल, [आरक्षित केबी ] [इंट] नॉट न्यूल, [इन्सर्टयूटीसीडेट] [डेटटाइम] नॉट न्यूल कॉन्स्ट्रेंट [डीएफ_टेबलस्टैटिस्टिक्स_इन्सर्टयूटीसीडेट] डिफॉल्ट (गेटटकडेट ()), [डेट] एएस (कन्वर्ट ([डेट], [इन्सर्टयूटीसीडेट])) परसिस्टेड, [काउंटरोबैक] [बिगिन्ट] NULL, [CountRowsNext] [bigint] NULL, [DataKBBack] [int] NULL, [DataKBNext] [int] NULL, [IndexSizeKBBack] [int] NULL, [IndexSizeKBNext] [int] NULL, [UnusedKBBack] [int] NULL , [अप्रयुक्त KBNext] [int] NULL, [ReservedKBBack] [int] NULL, [ReservedKBNext] [int] NULL, [AvgCountRows] AS (([CountRowsBack]+[CountRows])+[CountRowsNext])/(3)) स्थायी, [औसतडेटाकेबी] एएस ((([डेटाकेबीबैक]+[डेटाकेबी])+[डेटाकेबीनेक्स्ट])/(3)) जारी, [औसत इंडेक्ससाइजकेबी] एएस ((((इंडेक्ससाइजकेबीबैक)+[इंडेक्ससाइजकेबी])+[इंडेक्ससाइजकेबीनेक्स्ट])/ (3)) जारी, [औसत अप्रयुक्त केबी] एएस ((([अप्रयुक्त केबीबैक]+[अप्रयुक्त केबी])+[अप्रयुक्त केबीनेक्स्ट])/(3)) जारी, [औसत आरक्षित केबी] एएस (([आरक्षित केबीबैक]+[आरक्षित केबी])+[ आरक्षित केबीनेक्स्ट])/(3)) जारी, [डिफकाउंटरो] एएस (([काउंटरो नेक्स्ट]+[काउंटरो बैक])-(2)*[काउंटरोज]) परसिस्टेड, [डिफडाटाकेबी] एएस (([डेटाकेबीनेक्स्ट]+[डेटाकेबीबैक])- (2)*[DataKB]) जारी, [DiffIndexSizeKB] AS (([IndexSizeKBNext]+[IndexSizeKBBack])-(2)*[IndexSizeKB]) परसिस्टेड, [DiffUnusedKB] AS (([UnusedKBNext]+[UnusedKBBack])- (2)*[अप्रयुक्त KB]) जारी, [DiffReservedKB] AS (([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, [DataPageSizeKBNext] [int ] NULL, [AvgDataPageSizeKB] AS ((([DataPageSizeKBBack]+[DataPageSizeKB])+[DataPageSizeKBNext])/(3)) परसिस्टेड, [AvgUsedPageSizeKB] AS ((([UsedPageSizeNext]Back)+[UsedPageSizeKBBack]+[UsedPageSizeKBBack]+[UsedPageSizeKB] /(3)) जारी, [औसत कुल पृष्ठ आकार केबी] एएस ((( 2)*[DataPageSizeKB]) जारी रखा गया,--कास्टिंग बदलते समय दिखाता है [DiffUsedPageSizeKB] AS (([UsedPageSizeKBNext]+[UsedPageSizeKBBack])-(2)*[UsedPageSizeKB]) परसिस्टेड,--कास्टिंग बदलते ही दिखाता है [DiffTotalPageSizeKB] AS (([TotalPageSizeKBNext]+[TotalPageSizeKBBack])-(2)*[TotalPageSizeKB]) परसिस्टेड,--शो के रूप में कास्टिंग बदली जाती है CONSTRAINT [PK_TableStatistics] प्राथमिक कुंजी क्लस्टर ( [Row_GUID] ASC ) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ऑन [PRIMARY]) ऑन [PRIMARY]GOSET ANSI_pre> ONGO
TotalPageSizeKB तालिका के आकार को इंगित करता है।
सभी डेटाबेस तालिकाओं का TotalPageSizeKB + सिस्टम तालिकाओं का आकार =डेटाबेस डेटा का आकार।
- जानकारी एकत्र करने की प्रक्रिया निर्धारित करें:
उपयोग [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]। [InsertTableStatistics]ASBEGIN SET NOCOUNT ON; सेट ट्रांज़ेक्शन आइसोलेशन लेवल बिना पढ़े पढ़ा; @dt date=CAST(GetUTCDate() को तारीख के रूप में घोषित करें); @dbs nvarchar (255) घोषित करें; @sql nvarchar (अधिकतम) घोषित करें; sys.databases से #dbs में [name] चुनें; जबकि (मौजूद है (# डीबीएस से शीर्ष (1) 1 का चयन करें)) शीर्ष चुनें (1) @ डीबीएस =[नाम] # डीबीएस से शुरू करें; [srv] में @ sql=N'INSERT सेट करें। चुनें ,[TotalPageSizeKB] ,[UsedPageSizeKB] ,[DataPageSizeKB] फ्रॉम ['[email protected]+'].[inf].[vTableSize];'; निष्पादन sp_executesql @sql; #dbs से हटाएं जहां [name][email protected]; अंत ड्रॉप तालिका #dbs; @dt_back date=CAST(DateAdd(day,-1,@dt) को तिथि के रूप में घोषित करें);; tbl1 के साथ ([दिनांक], [काउंटरो], [डेटाकेबी], [इंडेक्ससाइजकेबी], [अप्रयुक्त केबी], [आरक्षित केबी], [सर्वरनाम], [डीबीनाम], [स्कीमानाम], [टेबलनाम], [टोटलपेज साइजकेबी] का चयन करें। [UsedPageSizeKB], [DataPageSizeKB] [srv] से। [अप्रयुक्त KBBack], [ReservedKBBack], [ServerName], [DBName], [SchemaName], [TableName], [TotalPageSizeKBBack], [UsedPageSizeKBBack], [DataPageSizeKBBack] [srv] से।[TableStatistics] जहां [दिनांक]उदाहरण@sqldat .com ) t2 सेट t2 को अपडेट करें। [अप्रयुक्त KB], t2। [ReservedKBBack] =t1.[ReservedKB], t2.[TotalPageSizeKBBack]=t1.[TotalPageSizeKB], t2.[UsedPageSizeKBBack] =t1.[UsedPageSiz eKB], t2। [DataPageSizeKBBack] =t1। [DataPageSizeKB] tbl1 से t1 के रूप में t1 आंतरिक tbl2 को t1 पर t2 के रूप में शामिल करें। [दिनांक] =दिनांक जोड़ें (दिन, -1, t2। [दिनांक]) और t1। [सर्वरनाम] =t2.[सर्वरनाम] और t1.[DBName]=t2.[DBName] और t1.[SchemaName]=t2.[SchemaName] और t1.[TableName]=t2.[TableName];; tbl1 के रूप में (चुनें [दिनांक], [काउंटरो], [काउंटरो नेक्स्ट], [डेटाकेबीनेक्स्ट], [इंडेक्ससाइजकेबीनेक्स्ट], [अप्रयुक्त केबीनेक्स्ट], [आरक्षित केबीनेक्स्ट], [सर्वरनाम], [डीबीनाम], [स्कीमानाम], [टेबलनाम], [TotalPageSizeKBNext], [UsedPageSizeKBNext], [DataPageSizeKBNext] [srv] से। [अप्रयुक्त केबी], [आरक्षित केबी], [सर्वरनाम], [डीबीनाम], [स्कीमानाम], [टेबलनाम], [टोटलपेज साइजकेबी], [यूज्डपेजसाइजकेबी], [डेटापेजसाइजकेबी] [एसआरवी] से।[टेबलस्टैटिस्टिक्स] जहां [दिनांक]उदाहरण@sqldat .com ) t1 सेट t1 अपडेट करें। [अप्रयुक्त KB], t1. [ReservedKBNext] =t2.[ReservedKB], t1.[TotalPageSizeKBNext]=t2.[TotalPageSizeKB], t1.[UsedPageSizeKBNext] =t2.[UsedPageSiz eKB], t1.[DataPageSizeKBNext] =t2। t2.[ServerName] और t1.[DBName]=t2.[DBName] और t1.[SchemaName]=t2.[SchemaName] और t1.[TableName]=t2.[TableName];ENDGO
एमएस एसक्यूएल सर्वर के सभी आवश्यक उदाहरणों से सभी डेटाबेस के टेबल के आकार पर डेटा एकत्र करने के लिए इस समाधान को संशोधित किया जा सकता है।
- एकत्र की गई जानकारी के आधार पर दृश्य को परिभाषित करें:
उपयोग [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOक्रिएट व्यू [srv]।[vTableStatisticsShort] d के रूप में (दिनांक जोड़ें (दिन, -1, अधिकतम ([दिनांक]) चुनें) ) [srv] से [दिनांक] के रूप में। , टी। [इंडेक्ससाइजकेबी], टी। [अप्रयुक्त केबी], टी। [आरक्षित केबी], टी। [सम्मिलित करेंयूटीसीडेट], टी। [दिनांक], टी। [काउंटरोबैक], टी। [काउंटरोज़नेक्स्ट], टी। [डेटाकेबीबैक], टी। [डेटाकेबीनेक्स्ट], टी। [इंडेक्ससाइजकेबीबैक], टी। [इंडेक्ससाइजकेबीनेक्स्ट], टी। [अप्रयुक्त केबीबैक], टी। [अप्रयुक्त केबीनेक्स्ट], टी। [आरक्षित केबीबैक], टी। [आरक्षित केबीनेक्स्ट], टी। [औसत काउंटररो], टी। [ औसतडाटाकेबी], टी। , टी। [TotalPageSizeKB] , टी। [TotalPageSizeKBBack] , टी। [TotalPageSizeKBNext], टी। [UsedPageSizeKB], टी। [UsedPageSizeKBBack], टी। [UsedPageSizeKBNext], टी। [डेटापेजसाइजकेबी], टी। [डेटापेज साइज केबीबैक], टी। [डेटापेज साइज केबीनेक्स्ट], टी। [AvgUsedPageSizeKB] , टी। ]=t.[दिनांक] जहां t.[CountRowsBack] रिक्त नहीं है और t.[CountRowsNext] nullGO नहीं है
यहां मैं आपका ध्यान डिफ की ओर आकर्षित करना चाहता हूं। यदि यह 0 से अधिक है, तो इसका मतलब है कि तालिका हर दिन तेजी से बढ़ती है।
संग्रह हर 24 घंटे में एक बार किया जाना चाहिए।
उसी तरह, हम निम्नलिखित दृश्य का उपयोग करके सभी डेटाबेस की फ़ाइल वृद्धि के संग्रह को स्वचालित कर सकते हैं:
[DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO को t2 चुनें। t1.IoStallMS ,t1.BytesOnDisk ,t1.[TimeStamp] ,t1.FileHandle ,t2.[Type_desc] ,t2.[FileName] ,t2.[Drive] ,t2.[Physical_Name] ,t2.[Ext] ,t2. [काउंटपेज], टी 2। [साइज एमबी], टी 2। [साइज जीबी], टी 2। [ग्रोथ], टी 2। [ग्रोथएमबी], टी 2। [ग्रोथ जीबी], टी 2। [ग्रोथपरसेंट], टी 2। [is_percent_growth], टी 2। [डेटाबेस_आईडी ], t2। [राज्य], t2। [StateDesc], t2। [IsMediaReadOnly], t2। [IsReadOnly], t2। [IsSpace], t2। [IsNameReserved], t2। [CreateLsn], t2। [DropLsn], t2.[ReadOnlyLsn] ,t2.[ReadWriteLsn] ,t2.[DifferentialBaseLsn] ,t2.[DifferentialBaseGuid] ,t2.[DifferentialBaseGuid] ,t2.[RedoStartLsn] ,t2.[RedoStart2.Ls.,T2. [RedoTargetForkGuid] ,t2.[BackupLsn] fn_virtualfilestats(NULL, NULL) से t1inner के रूप में [inf] शामिल हों। erDBFileInfo] t1 पर t2 के रूप में।[DbId]=t2.[database_id] और t1.[FileId]=t2.[File_Id]GO
परिणाम
इस लेख में, हमने सभी SQL सर्वर तालिकाओं और सभी डेटाबेस की फ़ाइलों के आकार और वृद्धि के बारे में डेटा संग्रह को स्वचालित करने के उदाहरण की खोज की। यह हमें डेटाबेस फ़ाइलों और इसकी तालिकाओं दोनों के आकार को बदलने के साथ-साथ तालिका या फ़ाइल को कम करने के लिए समय पर उपाय करने, डेटा स्टोरेज डिवाइस को बढ़ाने या जानकारी को कई डेटा स्टोरेज डिवाइस में विभाजित करने पर पूर्ण नियंत्रण प्रदान करता है।पी>