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

Мониторинг на TempDB на SQL Server чрез използване на динамични изгледи за управление (DMV)

Какво е TempDB в MS SQL Server?

TempDB е системна база данни в Microsoft SQL Server, използвана като хранилище на вътрешни обекти, версии на редове, работни таблици, временни таблици и индекси. TempDB е достъпен за използване от всички участници, свързани към екземпляр на SQL Server (това е глобален ресурс). За тези, които са запознати с други варианти на база данни, базата данни tempDB е подобна на пространството за таблици TEMP в Oracle. Меко казано, всичко, което не може да побере паметта на вашия екземпляр, се прелива във файловете с данни tempdb.

TempDB обикновено се използва в следните случаи:

  1. Временните таблици се създават с конвенцията за именуване #. Виждал съм едно или две приложения в моя магазин, които създават много от тези конвенции. В резултат на това може да повлияе на производителността. За всяка временна таблица TempDB разпределя страници, чийто размер зависи от размера на таблицата. Освен това може да има някои конфликти, ако няколко едновременни сесии създават такива TempTables едновременно.
  2. Нивото на изолация READ_COMMITTED_SNAPSHOT е активирано. Трябваше да направим това на два от нашите екземпляри преди няколко години, защото имаше две приложения, които изпитваха сериозен брой блокирания. Използването на нивата на изолация на моментни снимки е един от начините за справяне със застой, особено ако не искате да се обръщате напред-назад с разработчиците относно правилното кодиране. Трябва да сте наясно, че това се очаква да помогне за подобряване на производителността. Той обаче използва оптимистичен контрол на паралелността, който може да не е желателен във всички случаи по отношение на целостта на данните.
  3. Индексите се изграждат или възстановяват с опцията SORT_IN_TEMPDB=ON. Той има тенденция да премахва тежестта на сортирането от базата данни, която притежава индекса, докато процесът на възстановяване е в ход. Може да помогне да се проучи общото въздействие на тази опция върху производителността на екземпляра като цяло.
  4. Функционалността за множество активни набори от резултати (MARS) е активирана. Не, MARS не е планета в този сценарий, това е функция, която позволява на приложението да изпраща няколко партиди чрез една връзка. Той е деактивиран по подразбиране и може да бъде изрично активиран чрез включване на MultipleActiveResultSets=True в низ за връзка.
  5. Вътрешно SQL Server също използва TempDB за създаване на работни таблици, които обикновено се използват в операции с курсор – извиквания от клаузите GROUP BY, ORDER BY или UNION. Работните таблици могат да се разглеждат като временни таблици, създадени от дейността на двигателя на SQL Server, а не директно от потребителска активност.

Съответни динамични изгледи за управление на SQL сървър

Следните съответни динамични изгледи за управление (DMV) са полезни при изследване на дейността в TempDB:

  1. sys.dm_db_file_space_usage :Този DMV връща известна информация за използването на пространството на файловете в базите данни, които ви интересуват. Може да се използва за проверка на всяка база данни в екземпляра и изходът се отнася само за тази база данни. В контекста на тази статия ще използваме DMV, за да проверим TempDB.
  2. sys.dm_db_session_space_usage :Този DMV е изключителен за базата данни TempDB и връща броя на страниците, разпределени и освободени от всяка сесия за дадена база данни. Разпределението на страниците обикновено се поддържа до прекратяване на сесията.
  3. sys.dm_db_task_space_usage :Този DMV също е изключителен за базата данни TempDB и предоставя известна информация за броя на страниците, разпределени и освободени от всяка задача за дадена база данни.
  4. sys.dm_tran_active_snapshot_database_transactions :Този DMV връща активните транзакции, които генерират и могат да имат достъп до версии на редове. Този изглед е уместен, когато опции като ALLOW_SNAPSHOT_ISOLATION и READ_COMMITTED_SNAPSHOT са активирани.
  5. sys.dm_tran_version_store :Този DMV предоставя известна информация за всички записи на версиите в хранилището на версиите. В активен производствен сървър записите в тази таблица могат да нараснат значително. Затова трябва да бъдем внимателни, когато отправяме заявки към DMV.

Проверка на командите на DMV преди работа с TempDB база данни

sys.dm_file_space_usage

Можем да получим някои описания на тези DMV от документацията на Microsoft.

Таблица 1 показва описанието на sys.dm_file_space_usage . Заявката в листинг 1 показва използването на файловото пространство съответно за TempDB и WideWorldImporters бази данни. Снимки 1 и 2 връщат изходите от тази заявка съответно с TempDB и WideWorldImporters бази данни.

[table id=44 /]

Таблица 1:описание на sys.dm_file_space_usage

-- List 1: Check space usage on database files
-- Check space usage on tempdb
use tempdb
go
select db_name(database_id) [Database_name]
,file_name(file_id) [File_name]
,filegroup_id
,total_page_count [TPC]
,total_page_count*8/1024 [TSU (MB)]
,allocated_extent_page_count [AEPC]
,allocated_extent_page_count*8/1024 [AEPC (MB)]
,version_store_reserved_page_count [VSRP]
,version_store_reserved_page_count*8/1024 [VSRP (MB)]
,user_object_reserved_page_count [UORP]
,user_object_reserved_page_count*8/1024 [UORPC (MB)]
,internal_object_reserved_page_count [IORPC]
,internal_object_reserved_page_count*8/1024 [UORPC (MB)]
,mixed_extent_page_count [MEPC]
,mixed_extent_page_count*8/1024 [MEPC (MB)]
from sys.dm_db_file_space_usage;
-- Check space usage on WideWorldImporters
use WideWorldImporters
go
select db_name(database_id) [Database_name]
,file_name(file_id) [File_name]
,filegroup_id
,total_page_count [TPC]
,total_page_count*8/1024 [TSU (MB)]
,allocated_extent_page_count [AEPC]
,allocated_extent_page_count*8/1024 [AEPC (MB)]
,version_store_reserved_page_count [VSRP]
,version_store_reserved_page_count*8/1024 [VSRP (MB)]
,user_object_reserved_page_count [UORP]
,user_object_reserved_page_count*8/1024 [UORPC (MB)]
,internal_object_reserved_page_count [IORPC]
,internal_object_reserved_page_count*8/1024 [UORPC (MB)]
,mixed_extent_page_count [MEPC]
,mixed_extent_page_count*8/1024 [MEPC (MB)]
from sys.dm_db_file_space_usage;

Фиг. 2 Изход на заявка за sys.dm_file_space_usage (WideWorldImporters)

Имайте предвид, че колоната total_page_count показва точния размер на въпросния файл с база данни. Освен това, файловите типове LOG и FILESTREAM не се показват. Също така, както се очаква, allocated_extent_page_count съответства на използваното пространство във файла с данни WWI_UserData.

Фиг. 3 Размери на файлове в базата данни WideWorldImporters

sys.dm_db_session_space_usage

Таблица 2 показва използването на sys.dm_db_session_space_usage DMV. Списък 2 е изходът от заявката. Имайте предвид, че броят на върнатите редове съвпада с текущия брой сесии (активни или неактивни) в екземпляра. Също така, припомнете си, че този DMV се отнася САМО до TempDB.

[table id=45 /]

Таблица 2:описание на sys.dm_db_session_space_usage

-- Listing 2: Check space allocation per session in the instance
-- Applies on to tempdb database
select
session_id
,db_name(database_id) [Database_name]
,user_objects_alloc_page_count [UOAPC]
,user_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,user_objects_dealloc_page_count [UODPC]
,user_objects_dealloc_page_count*8/1024 [UODPC (MB)]
,internal_objects_alloc_page_count [UOAPC]
,internal_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,internal_objects_dealloc_page_count [UODPC]
,internal_objects_dealloc_page_count*8/1024 [UODPC (MB)]
from sys.dm_db_session_space_usage;
select count(*) from sys.dm_exec_sessions;

sys.dm_db_task_space_usage

Таблица 3 показва изпълнението на sys.dm_db_task_space_usage DMV. Списък 3 показва неговия изход.

[table id=46 /]

Таблица 3:описание на sys.dm_db_task_space_usage

-- List 3: Check space allocation per task int the instance
-- Applies on to tempdb database
select
task_address
,is_remote_task
,session_id
,request_id
,exec_context_id
,db_name(database_id) [Database_name]
,user_objects_alloc_page_count [UOAPC]
,user_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,user_objects_dealloc_page_count [UODPC]
,user_objects_dealloc_page_count*8/1024 [UODPC (MB)]
,internal_objects_alloc_page_count [UOAPC]
,internal_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,internal_objects_dealloc_page_count [UODPC]
,internal_objects_dealloc_page_count*8/1024 [UODPC (MB)]
from sys.dm_db_task_space_usage;

Други DMV заявки в MSSQL TempDB

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

[table id=47 /]

Таблица 4:описание на sys.dm_tran_active_snapshot_database_transactions

[table id=48 /]

Таблица 5:описание на sys.dm_tran_version_store

Проверка на DMV след завършване на дейността на базата данни

Нека генерираме малко активност.

За да направите това, изпълнете простите заявки в листинг 4.

-- Listing 4
-- Query 1
use WideWorldImporters
go
select * from
[Sales].[Invoices];
-- Query 2
use WideWorldImporters
go
select * from
[Sales].[Invoices]
order by ContactPersonID;

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

-- Listing 5
use WideWorldImporters
go
select *
into [#Invoices]
from [Sales].[Invoices];
use tempdb
go
drop table [#Invoices];

Сега получаваме значителен брой страници, разпределени и запазени за нашата активна сесия 62 (виж Фиг. 8). Също така, обърнете внимание на значителния брой разпределени екстенти и запазени страници, показани в sys.dm_db_file_space_usage (фиг. 9).

Когато продължим и пуснем Temptable #Invoice, виждаме, че страниците, разпределени в TempDB, се освобождават, както е показано на Фиг. 12. Въпреки това, изходът на dm_db_session_space_usage DMV все още показва, че някои страници са разпределени към сесията. Виждаме, че това се освобождава веднага щом затворим сесията (идентификатор на сесия 62).

След това отваряме друга сесия и създаваме индекс, използвайки заявките в листинг 6. В заявка 1, с изключение на опцията SORT_IN_TEMPDB и в заявка 2, ние използваме тази опция, след като изтрием индекса. Не се случват значителни разпределения за първия случай, но виждаме някои промени, докато използваме SORT_IN_TEMPDB. Тази промяна е много малка предвид размера на въпросния индекс (вижте фиг. 16 и 17).

Ще извършим последния тест. Откриваме, че до този момент DMV като sys.dm_tran_active_snapshot_database_transactions и sys.dm_tran_version_store не връщат редове при запитване.

Нека активираме нивата на изолация SNAPSHOT_ISOLATION и READ_COMMITTED_SNAPSHOT (листинг 7). След като бъде направено, един оператор за актуализиране създава запис в sys.dm_tran_version_store DMV. Поставянето на същата тази заявка е транзакция, която използваме, за да видим, че запис също се генерира в sys.dm_tran_active_snapshot_database_transactions по време на транзакцията.

-- Listing 7
ALTER DATABASE WideWorldImporters
SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER DATABASE WideWorldImporters
SET READ_COMMITTED_SNAPSHOT ON;
-- Listing 8
-- Query 1
 update [WideWorldImporters].[Sales].[Invoices]
 set DeliveryInstructions='Shop 50, 1476 Poddar Lane'
 where InvoiceID=48;
-- Query 2
-- Transaction
BEGIN TRAN
 update [WideWorldImporters].[Sales].[Invoices]
 set DeliveryInstructions='Shop 50, 1476 Poddar Lane'
 where InvoiceID=48;
 WAITFOR DELAY '00:00:30';
COMMIT TRAN;
GO

Заключение

Накратко проучихме, че можем да наблюдаваме активността на TempDB, използвайки пет ключови DMV, изложени от SQL Server. Когато използваме това ниво на процеса на наблюдение в производствена среда, можем да определим дали имаме нужда от повече място в TempDB и файлове с данни. Освен това можем да анализираме въздействието на изолацията на SNAPSHOT, ако сме активирали тази функция преди.

Изходните данни на тези DMV също могат да бъдат полезни за ясно показване на разработчиците на приложения влиянието на тяхното поведение на кода върху tempDB и инстанцията като цяло. Като цяло е доста възнаграждаващо да се разбере използването на тези DMV като DBA, занимаващ се с управлението на производителността и пространството.

Препратки

Изолация на моментна снимка в SQL Server
Използване на множество активни набори от резултати
Описание на sys.dm_tran_version_store
Описание на sys.dm_db_task_space_usage
Описание на sys.dm_file_space_usage
Описание на sys.dm_ussage_space_usage
Описание на sys.dm_tran_active_snapshot_database_transactions


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Средно несъответствие на float

  2. Нива на изолация на SQL сървър:серия A

  3. SqlParameter не позволява име на таблица - други опции без атака на sql инжекция?

  4. Знаете ли кога да опитате отново или да не успеете при извикване на SQL Server от C#?

  5. SQL Server Database Change Listener C#