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

SQL Server – Дисектирайте вътрешните елементи на sp_spaceused

Тази статия е опит за дисекция на изхода на sp_spaceused съхранена процедура.

Въведение

Разбирането на вътрешността на използването на базата данни и тенденциите на растеж играят жизненоважна роля за определянето на правилния размер на базата данни. sp_spaceused е може би най-широко изпълняваната системна съхранена процедура от администратора за намиране на дисковото пространство, използвано от база данни. Това помага да получите бърз поглед върху използването на базата данни. статистика. sp_spaceused се използва за показване на броя на редовете, размера на данните, размера на индекса, количеството използвано пространство, неизползваното пространство от всеки обект и неразпределения размер на базата данни. Въпреки че гледайки стойностите, дадени от sp_spaceused, не бива да мислите за свиване на базата данни или файла с данни или регистрационния файл. Много пъти ние не осъзнаваме какво правим. Много пъти ние не знаем какви биха били последствията от извършването на подобни операции с присъщи ресурси. Резултатът от sp_spaceused ни казва много за текущата производителност на базата данни. Внеразпределените колона и нанеизползвана колона ни кажете свободното място, останало на нивата на базата данни и таблицата.

Тази статия разглежда:

  1. Поглед в sp_spaceused
  2. Влияние на настройката за автоматичен растеж върху колоните, неразпределени и неизползвани
  3. Намиране на подробности за използването на пространството в базата данни и нивата на екземпляра
  4. Измерване на събитията за автоматичен растеж
  5. Намиране на размерите на mdf и ldf файлове
  6. Фактори, определящи производителността на базата данни
  7. И още...

Вътрешни елементи на sp_spaceused

Уловете подробности за използването на пространството от всички таблици

В долния T-SQL недокументираната съхранена процедура sp_MSforeachtable се използва за преминаване на всички таблици в обхвата на текущия контекст на базата данни, за да се получат показателите за използване на пространството на всички таблици в контекста.

Деклариране на @tbl_sp_spaceused table( име varchar(100) NULL, редове bigint NULL, запазени varchar(20) NULL, данни varchar(20) NULL, index_size varchar(20) NULL, неизползван varchar(20) NULL )-- вмъкване изход на sp_spaceused към променлива на таблица INSERT INTO @tbl_sp_spaceused ( име, редове, запазени, данни, index_size, неизползвани )EXEC sp_MSforeachtable @command1 ='EXEC sp_spaceused [?]'SELECT *FROM @tbl_sp_spaceusedorder
desc по редове

Уловете подробности за използването на пространството на всички бази данни

Недокументираната съхранена процедура sp_MSforeachDB се използва за преминаване на цялата база данни в обхвата на текущия SQL екземпляр, за да се получи информацията за използването на пространството на всички бази данни.

декларирайте таблица @tbl_sp_spaceusedDBs(name_base_name varchar(100) NOT NULL, database_size varchar(50) NULL, неразпределен varchar(30) NULL, запазен varchar(20) NULL, data varchar(20) NULL, index_size varchar(20) , unused varchar(20) NULL )INSERT INTO @tbl_sp_spaceusedDBs (име_на_база_данни, размер_на_база_данни, неразпределени, запазени, данни, index_size, неизползвани )EXEC sp_msforeachdb @command1="използвайте ? exec sp_spaceused @oneresult_name @oneresult_name @oneresult_space_ROM база_размер

Тук име_на_база_данни е името на базата данни; в този случай PythonSample . размер_база_данни е Unallocated+Reserved+Data+Index+Unused =MDF +LDF (=848 MB в този случай). Внеразпределените пространството тук е 51,94 MB.

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

неразпределеното пространството е свободното пространство във файла с данни, така че да не се налага да нараства автоматично всеки път, когато задавате заявка; обикновено SQL Server Storage Engine управлява автоматичното нарастване, използвайки механизъм, известен като алгоритъм за пропорционално запълване. Управлението на екстентите се извършва ефективно въз основа на броя на записванията, които се случват във файловете. И в същото време, когато използваното пространство достигне праг, се задейства събитие за по-нататъшен автоматичен растеж. Задаването на правилната стойност на неразпределено пространство зависи от нуждите и ситуациите, както и естеството на използване на базата данни. Неразпределеното пространство е пространството, което все още не се използва и е „използвано“. По същество тези екстенти са маркирани с бит 1 на страницата GAM. Разбирайки концепцията за автоматичен растеж отгоре, всеки тип растеж може да генерира допълнителни неразпределени екстенти.

Използвайки следната SQL заявка, можем да видим колко пъти е генерирано събитието за автоматично нарастване, заедно с времето, през което базата данни е била задържана за процеса.

DECLARE @fname NVARCHAR(1000);-- Вземете името на текущата trace по подразбиранеSELECT @fname =CAST(стойност AS VARCHAR(MAX))FROM ::fn_trace_getinfo(DEFAULT)WHERE traceid =1 И свойство =2;SELECT; ft.StartTime [Начално време] ,t.name [Име на събитие] ,DB_NAME(ft.databaseid) [Име на база данни] ,ft.Filename [Име на файл] ,(ft.IntegerData*8)/1024.0 [Растеж MB] ,( ft.duration/1000) [Duration MS]FROM ::fn_trace_gettable(@fname, DEFAULT) AS ft INNER JOIN sys.trace_events AS t ON ft.EventClass =t.trace_event_id WHERE (ft.EventClass =le 92-g DateFi ИЛИ ft.EventClass =93) -- Автоматичен растеж на LogFile ORDER BY ft.StartTime

Нека да разгледаме какво означава всеки от термините:

Запазено :Мястото, запазено за използване от обекти на база данни =(Данни + Индекс + Неизползвани ) =476704 + 1280 + 1312 =479296 KB. Това показва колко пълни са обектите; в идеалния случай 10% от неизползваното пространство се очаква за транзакционни таблици.

Данни :Реалният размер на данните. Това е сборът от всички файлове с данни на базата данни.

Индекс :Количеството пространство, използвано от индекса.

Забележка:В някои случаи съм виждал, че размерът на размера на индекса е по-голям от размера на действителните данни. Що се отнася до индексите, това, което е необходимо за системата, винаги зависи от производителността на базата данни. Много пъти операциите за четене са по-важни от операциите за запис. И в някои други случаи писането е по-важно от четенето. В случаите, когато бизнесът е решил, че четенето е много по-важно от записването, тази система може да се нуждае от тонове индекси, за да удовлетвори изискванията за производителност на бизнеса и потребителите.

Неизползван :Част от запазеното пространство, което все още не се използва

Неизползвани са страниците на разпределени екстенти, но все още не се използват от нито един обект. Веднага след като екстентът бъде разпределен (като униформен или споделен екстент), получаваме осем запазени страници за този екстент. Някои страници се използват, а други не се използват.

Неизползванът инеразпределени колоните в изхода може да са объркващи. За уточняване, неизползванът изходът на колона не показва количеството свободно място, останало в цялата база данни. Вместо това е общото пространство, запазено за таблици, но не е запълнено с данни. В много случаи неизползваното пространство може да бъде възстановено чрез създаване на клъстериран индекс или управление на съществуващите индекси.

Резултатът от sp_spaceused може допълнително да бъде опростен, за да се намери размерът на .mdf файла и .log файловете. Сумата от запазеното и неразпределеното пространство е повече или по-малко равна на размера на файла с данни или MDF. Освен това, изваждането на размера на MDF файла от размера на базата данни дава размера на регистрационния файл.

Ето две формули:

Размер на MDF файла =запазено + неразпределено пространство

Размер на регистрационния файл =Database_Size – Размер на MDF файл

ИЗБЕРЕТЕ 476704+ 1280+ 1312 „Резервирани КБ“, (479296/1024,00)+51,94 „MDFSizeMB“, 848,00 - ((479296/1024,00)+51,94 МБ „ 

Гореспоменатите точки ни казват как всяка от колоните в изхода на sp_spaceused се интерпретира, изчислява и анализира.

Влияние на настройката за автоматичен растеж

Първоначалните размери и конфигурацията за автоматично нарастване имат значителен ефект върху неизползваното пространство. Задаването на правилните стойности за тях е предизвикателство. Виждал съм много случаи, при които автоматичният растеж е бил настроен да расте в проценти. Да приемем, че автоматичният растеж е зададен на 25% за размер на файл с данни от 100 GB. Необходими са само 4 събития за автоматично нарастване, за да се запълни дисковото устройство.

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

Нека разгледаме сценарий, при който настройката за автоматично нарастване не е зададена правилно в базата данни. Това отново е проблем:Ако автоматичното нарастване е активирано в базата данни, това означава, че разширяването на устройството се извършва автоматично по време на някакво събитие, дори ако данните не използват цялото пространство.

Винаги е добра практика да зададете подходящата настройка за автоматично нарастване за файла с данни. Понякога неправилната настройка на файла с данни може да инжектира физическа фрагментация, което води до сериозно влошаване на производителността на системата. С други думи, ако нямате неразпределено пространство, новите данни ще се опитат да седят на празни места, които може да бъдат разпръснати. Това важи и за регистрационния файл. Неразпределеното пространство в базата данни косвено влияе върху настройката за автоматично нарастване на файла с данни и регистрационния файл и пряко влияе върху производителността. Те са ключът към намирането на правилния баланс.

Приключване

  1. В процеса на създаване на база данни определеният размер (т.е. първоначалният размер) не е нищо друго освен действителният размер на базата данни. Този първоначален размер се записва в заглавката на страницата. По време на процеса на свиване на базата данни процесът използва минималния размер свойство като препратка, само ако действителният размер на данните е по-малък от минималния размер — минималният размер също се намира в заглавката на страницата и може да се види с помощта на командата DBCC PAGE. Също така същият процес важи и за DBCC SHRINKFILE, който свива файловете до по-малко от първоначалните им размери.
  2. Не е препоръчителна практика да се свива базата данни, за да се освободи дисково пространство, въпреки че решението зависи от сценария — необичайните сценарии може да налагат неконвенционално действие. Трябва обаче да се помни, че свиването на база данни въвежда фрагментация в базата данни. Винаги е добра практика да се анализира основната причина занеразпределено пространство инеизползвано място на обектите. В много случаи разширяването на диска за справяне с нарастването на данните би било жизнеспособна/препоръчителна опция.
  3. Конфигурация за автоматично нарастване:Когато SQL Server изпълнява операция за автоматично нарастване, транзакцията, която е задействала събитието за автоматично нарастване, ще трябва да изчака, докато събитието за автоматично нарастване завърши. Само тогава самата транзакция може да завърши.
  4. Винаги се препоръчва да задавате опциите за автоматичен растеж в числа, вместо в проценти.
  5. Индукцията на неизползвано място в таблицата може да се дължи на следните причини:
    • Фрагментация
      Когато данните са фрагментирани поради естеството и типа на дефиницията, се генерира известно неизползвано пространство. Също така, честа модификация на данните (всички операции АКТУАЛИЗИРАНЕ, ВМЕСВАНЕ ИЛИ ИЗТРИВАНЕ) води до по-голям брой разделяния на страници, което е по-вероятно да генерира неизползвано място в таблицата.
    • Няма клъстериран индекс в таблицата
      За да се намали фрагментацията в Heap, може да се помисли за създаване на клъстериран индекс на масата. За да намалите фрагментацията на индекса, извършете поддръжка на индекса, като определите стойността avg_fragmentation_in_percent.
    • Размер на данните
      В някои случаи използването на подходящи типове данни води до по-малки редове с данни, което от своя страна позволява поставянето на повече редове в страница. Това не само намалява вътрешното неизползвано пространство, но също така оказва влияние върху производителността, като намалява броя на разделянето на страници.
  6. Неизползваното пространство може също да е резултат от отпадане на колоната с променлива дължина. Използвайте DBCC CLEANTABLE, след като направите значителни промени в колоните с променлива дължина в таблица или индексиран изглед, за да възстановите незабавно неизползваното пространство. Като алтернатива можете да изградите отново индексите на таблицата или изгледа; обаче това е по-ресуроемка операция.
  7. Неизползваното пространство е относително по-голямо, когато в крайна сметка заредим относително по-големи данни (>8 KB). В такива случаи получаваме големи количества неизползвано място на страниците с данни.
  8. След миграция на SharePoint може да се види значителна част от неизползваното пространство, въведено в базите данни. Възстановяването е по-бавен процес, процесът на призрачно почистване премахва тези страници и освобождаването се случва за определен период от време.
  9. В някои случаи стойностите на sp_spaceused може да не са правилни. Въпреки че sp_spaceused получава своята информация от системния обект, който съдържа всички оценки, понякога може да бъде неточен. Една от причините за това е, че по време на миграция на база данни, или в случай на остаряла статистика, или когато системата е подложена на чести DDL модификации, или след извършване на огромни операции за групово копиране. За да синхронизирате системни обекти, използвайте изразите DBCC updateusage(0) или DBCC CHECKTABLE, за да гарантирате, че sp_spaceused връща актуални точни данни. Не забравяйте обаче, че DBCC командите са ресурсоемки; имат добро разбиране за последиците от използването му. Когато изпълним командата DBCC updateusage, SQL Server Database Engine сканира страниците с данни в базата данни и прави необходимите корекции вsys.allocation_units и sys.partitions каталожни изгледи относно пространството за съхранение, използвано от всяка таблица.

Препратки

  • https://msdn.microsoft.com/en-us/library/cc280360.aspx
  • https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-cleantable-transact-sql
  • https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-database-files-transact-sql

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземете ROWS като КОЛОНИ (динамична PIVOT заявка на SQL Server)

  2. Дефиницията на SSRS отчета е по-нова от сървъра

  3. Премахване на дублиращи се редове (въз основа на стойности от множество колони) от SQL таблица

  4. LEFT() срещу SET TEXTSIZE в SQL Server:Каква е разликата?

  5. Защо няма прозоречни функции в клаузите where?