Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Monitorowanie bazy danych SQL Server TempDB przy użyciu widoków zarządzania dynamicznego (DMV)

Co to jest TempDB w MS SQL Server?

TempDB to systemowa baza danych w Microsoft SQL Server używana jako magazyn obiektów wewnętrznych, wersji wierszy, tabel roboczych, tabel tymczasowych i indeksów. Baza danych TempDB jest dostępna dla wszystkich uczestników podłączonych do instancji SQL Server (jest to zasób globalny). Dla osób zaznajomionych z innymi smakami bazy danych baza danych tempDB jest podobna do obszaru tabel TEMP w Oracle. Mówiąc delikatnie, wszystko, co nie mieści się w pamięci instancji, przenosi się do plików danych tempdb.

Baza danych TempDB jest zwykle używana w następujących przypadkach:

  1. Tabele tymczasowe są tworzone przy użyciu konwencji nazewnictwa #. Widziałem w moim sklepie jedną lub dwie aplikacje, które tworzą całe mnóstwo takich konwencji. W rezultacie może to wpłynąć na wydajność. Dla każdej tabeli tymczasowej TempDB dystrybuuje strony, których rozmiar zależy od rozmiaru tabeli. Ponadto mogą wystąpić pewne konflikty, jeśli kilka równoczesnych sesji tworzy takie TempTables jednocześnie.
  2. Poziom izolacji READ_COMMITTED_SNAPSHOT jest włączony. Musieliśmy to zrobić na dwóch naszych instancjach kilka lat temu, ponieważ były dwie aplikacje, które doświadczały poważnej liczby impasów. Korzystanie z poziomów izolacji migawek jest jednym ze sposobów radzenia sobie z zakleszczeniami, szczególnie jeśli nie chcesz rozmawiać z programistami w tę iz powrotem na temat prawidłowego kodowania. Należy mieć świadomość, że ma to pomóc w poprawie wydajności. Wykorzystuje jednak optymistyczną kontrolę współbieżności, która może nie być pożądana we wszystkich przypadkach w odniesieniu do integralności danych.
  3. Indeksy są budowane lub przebudowywane za pomocą opcji SORT_IN_TEMPDB=ON. Ma tendencję do usuwania ciężaru sortowania z bazy danych, która jest właścicielem indeksu, podczas gdy proces odbudowy jest w toku. Pomocne może być zbadanie całkowitego wpływu tej opcji na wydajność instancji jako całości.
  4. Funkcja wielu aktywnych zestawów wyników (MARS) jest włączona. Nie, w tym scenariuszu MARS nie jest planetą, jest to funkcja, która umożliwia aplikacji przesyłanie kilku partii za pośrednictwem jednego połączenia. Jest on domyślnie wyłączony i można go jawnie włączyć, dołączając MultipleActiveResultSets=True do ciągu połączenia.
  5. Wewnętrznie SQL Server używał również bazy danych TempDB do tworzenia tabel roboczych, które są powszechnie używane w operacjach kursora — wywołania przez klauzule GROUP BY, ORDER BY lub UNION. Tabele robocze można traktować jako tabele tymczasowe tworzone przez działanie silnika SQL Server, a nie bezpośrednio przez działanie użytkownika.

Odpowiednie dynamiczne widoki zarządzania SQL Server

Następujące odpowiednie widoki dynamicznego zarządzania (DMV) są pomocne podczas badania aktywności w TempDB:

  1. sys.dm_db_file_space_usage :Ten DMV zwraca pewne informacje o wykorzystaniu miejsca przez pliki w interesujących Cię bazach danych. Może być użyty do zbadania dowolnej bazy danych w instancji, a dane wyjściowe dotyczą tylko tej bazy danych. W kontekście tego artykułu będziemy używać DMV do badania TempDB.
  2. sys.dm_db_session_space_usage :Ten DMV jest przeznaczony wyłącznie dla bazy danych TempDB i zwraca liczbę stron przydzielonych i cofniętych alokacji przez każdą sesję dla danej bazy danych. Przydziały stron są zwykle utrzymywane do zakończenia sesji.
  3. sys.dm_db_task_space_usage :Ten DMV jest również wyłączny dla bazy danych TempDB i dostarcza pewnych informacji o liczbie stron przydzielonych i cofniętych przez każde zadanie dla danej bazy danych.
  4. sys.dm_tran_active_snapshot_database_transactions :ten DMV zwraca aktywne transakcje, które generują i mogą uzyskiwać dostęp do wersji wierszy. Ten widok jest istotny, gdy włączone są opcje takie jak ALLOW_SNAPSHOT_ISOLATION i READ_COMMITTED_SNAPSHOT.
  5. sys.dm_tran_version_store :Ten DMV zawiera informacje o wszystkich rekordach wersji w magazynie wersji. Na aktywnym serwerze produkcyjnym rekordy w tej tabeli mogą znacznie wzrosnąć. Dlatego musimy być ostrożni podczas wysyłania zapytań do DMV.

Badanie poleceń DMV przed rozpoczęciem pracy z bazą danych TempDB

sys.dm_file_space_usage

Niektóre opisy tych DMV możemy uzyskać z dokumentacji firmy Microsoft.

Tabela 1 przedstawia opis sys.dm_file_space_usage . Zapytanie na liście 1 wyświetla użycie przestrzeni plików odpowiednio dla baz danych TempDB i WideWorldImporters. Obrazy 1 i 2 zwracają dane wyjściowe tego zapytania odpowiednio z bazami danych TempDB i WideWorldImporters.

[identyfikator tabeli=44 /]

Tabela 1:opis 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;

Rys. 2 Wyjście zapytania na sys.dm_file_space_usage (WideWorldImporters)

Zwróć uwagę, że kolumna total_page_count pokazuje dokładny rozmiar danego pliku bazy danych. Ponadto typy plików LOG i FILESTREAM nie są wyświetlane. Ponadto, zgodnie z oczekiwaniami, allocated_extent_page_count pasuje do używanego miejsca w pliku danych WWI_UserData.

Rys. 3 Rozmiary plików w bazie danych WideWorldImporters

sys.dm_db_session_space_usage

Tabela 2 przedstawia użycie DMV sys.dm_db_session_space_usage. Listing 2 jest wynikiem zapytania. Zwróć uwagę, że liczba zwróconych wierszy odpowiada bieżącej liczbie sesji (aktywnych lub nieaktywnych) w instancji. Pamiętaj też, że ten DMV dotyczy TYLKO bazy danych TempDB.

[identyfikator tabeli=45 /]

Tabela 2:opis 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

Tabela 3 przedstawia implementację DMV sys.dm_db_task_space_usage. Listing 3 wyświetla jego dane wyjściowe.

[identyfikator tabeli=46 /]

Tabela 3:opis 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;

Inne zapytania DMV w MSSQL TempDB

Pozostałe dwa DMV wydają się być puste przed wykonaniem jakiejkolwiek aktywności bazy danych. Tabele 4 i 5 przedstawiają opis obu tabel. W następnej sekcji przyjrzymy się, jak zmieniają się dane w DMV, gdy generujemy aktywność bazy danych.

[identyfikator tabeli=47 /]

Tabela 4:opis sys.dm_tran_active_snapshot_database_transactions

[identyfikator tabeli=48 /]

Tabela 5:opis sys.dm_tran_version_store

Badanie DMV po zakończeniu działania bazy danych

Wygenerujmy trochę aktywności.

Aby to zrobić, uruchom proste zapytania z listingu 4.

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

Jak widać, nie ma znaczących alokacji ani cofnięć z tego małego zapytania, więc podnosimy poprzeczkę, tworząc tabelę tymczasową za pomocą skryptu z Listingu 5.

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

Otrzymujemy teraz znaczną liczbę stron przydzielonych i zarezerwowanych dla naszej aktywnej sesji 62 (patrz rys. 8). Zwróć także uwagę na znaczną liczbę przydzielonych zakresów i zarezerwowanych stron pokazanych w sys.dm_db_file_space_usage (Rys. 9).

Kiedy przejdziemy dalej i upuścimy Temptable #Invoice, widzimy, że strony przydzielone w TempDB są zwalniane, jak pokazano na rys. 12. Jednak dane wyjściowe DMV dm_db_session_space_usage nadal wskazują, że niektóre strony są przydzielone do sesji. Widzimy, że jest to udostępniane, gdy tylko zamkniemy sesję (identyfikator sesji 62).

Następnie otwieramy kolejną sesję i tworzymy indeks za pomocą zapytań z Listingu 6. W Zapytaniu 1 wyłączając opcję SORT_IN_TEMPDB, aw Zapytaniu 2 używamy tej opcji po upuszczeniu indeksu. W pierwszym przypadku nie występują żadne znaczące alokacje, ale widzimy pewne zmiany podczas korzystania z SORT_IN_TEMPDB. Ta zmiana jest bardzo niewielka, biorąc pod uwagę rozmiar danego indeksu (patrz Rys. 16 i 17).

Przeprowadzimy ostateczny test. Dowiadujemy się, że do tej chwili DMV, takie jak sys.dm_tran_active_snapshot_database_transactions i sys.dm_tran_version_store, nie zwracają żadnych wierszy po zapytaniu.

Włączmy poziomy izolacji SNAPSHOT_ISOLATION i READ_COMMITTED_SNAPSHOT (Listing 7). Po zakończeniu pojedyncza instrukcja aktualizacji tworzy rekord w DMV sys.dm_tran_version_store. Umieszczenie tego samego zapytania jest transakcją, której używamy, aby zobaczyć, że rekord jest również generowany w sys.dm_tran_active_snapshot_database_transactions podczas transakcji.

-- 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

Wniosek

Pokrótce zbadaliśmy, że możemy monitorować aktywność bazy danych TempDB przy użyciu pięciu kluczowych DMV udostępnianych przez SQL Server. Korzystając z tego poziomu procesu monitorowania w środowisku produkcyjnym, możemy określić, czy potrzebujemy więcej miejsca w TempDB i plikach danych. Możemy również przeanalizować wpływ izolacji SNAPSHOT, jeśli wcześniej włączyliśmy tę funkcję.

Dane wyjściowe tych DMV mogą być również pomocne w jasnym pokazywaniu programistom aplikacji wpływu ich zachowania kodu na tempDB i instancję jako całość. Ogólnie rzecz biorąc, całkiem satysfakcjonujące jest zrozumienie wykorzystania tych DMV jako DBA zajmującego się wydajnością i zarządzaniem przestrzenią.

Referencje

Izolacja migawki w programie SQL Server
Korzystanie z wielu aktywnych zestawów wyników
Opis sys.dm_tran_version_store
Opis sys.dm_db_task_space_usage
Opis sys.dm_file_space_usage
Opis sys.dmspace_db_session
Opis 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. Unikalny identyfikator (guid) jako klucz podstawowy w projekcie bazy danych

  2. INSTR() odpowiednik w SQL Server

  3. Jak znaleźć sortowanie w SQL Server (T-SQL)

  4. Pamiętaj o tym podczas formatowania typu danych TIME w SQL Server (T-SQL)

  5. Kolumna niepoprawna na liście wyboru, ponieważ nie jest zawarta ani w funkcji agregującej, ani w klauzuli GROUP BY