Mamy bazę danych SQL Server 2005, baza danych temp została zapełniona. Wchodząc do SQL Server Management Studio widzę wszystkie tabele tymczasowe w tempdb. Czy można stwierdzić, która sesja przechowuje tabelę temp? Idealnie byłoby zapytanie, które wyświetlałoby tabele tymczasowe używane przez każdą sesję.
Dzięki,
sql-server
sql-server-2005
tempdb
SQLMIKE
źródło
źródło
Odpowiedzi:
Poprosiłem o zbudowanie czegoś w 2007 roku na Connect. Zostało to odrzucone w wersji 2008, a następnie zignorowane, dopóki Connect nie zmarł kilka lat temu. Próbowałem znaleźć go na nowej stronie z opiniami dla SQL Server , ale to wyszukiwanie jest absolutnym pożarem śmietnika. Tytuł mojego żądania brzmiał: „dmv odwzorować tabelę temp na id_sesji” - ponieważ wyszukiwanie może wykonać tylko operację LUB, „mapa temp tabeli” zwraca 118 stron wyników. Wydaje się, że Google sugeruje, że przedmiot nie zrobił cięcia, gdy zabili Connect .
W międzyczasie dla SQL Server 2005 i 2008 powinieneś być w stanie pobrać te informacje z domyślnego śledzenia:
Bezwstydnie zdjęty z tego posta na blogu Jonathana Kehayiasa .
Aby określić wykorzystanie miejsca, możesz to jeszcze bardziej ulepszyć, aby dołączyć dane z widoków takich jak
sys.db_db_partition_stats
- np .:Problemem jest tutaj próba skorelowania nazwy tabeli z tekstem zapytania; to po prostu nie jest praktyczne, ponieważ przez większość czasu użytkownik nadal nie wykonuje zapytania względem tej tabeli (nie wspominając o tym, że nadal uruchamia ten, który ją utworzył / zapełnił).
Jednak dotyczy to innych czytelników (lub Ciebie podczas aktualizacji), domyślny ślad w 2012+ nie śledzi już tworzenia obiektu tabeli temp , jeśli tabela #temp jest stertą. Nie jestem pewien, czy jest to zbieg okoliczności, czy bezpośrednio związany z faktem, że od 2012 r. Wszystkie tabele temp mają teraz wartość ujemną
object_id
. Możesz oczywiście przejść do Rozszerzonych wydarzeń, aby pomóc Ci zebrać i śledzić te informacje, ale to prawdopodobnie dużo pracy ręcznej (a ja tylko zweryfikowałem, że nie są one już śledzone - możesz nie być w stanie ich wybrać w Wydarzeniach rozszerzonych). Domyślny ślad to podnieś tabele temp. utworzone za pomocą PK lub innego ograniczenia albo z ograniczeniami lub indeksami dodanymi po zdarzeniu tworzenia, ale wtedy będziesz musiał poluzować ograniczenia czasowe powyżej (indeks można utworzyć znacznie później niż 100 ms po kreacja).Kilka innych odpowiedzi na tej stronie, które mogą być przydatne:
Jak rozpoznać, które zapytanie wypełnia dziennik transakcji tempdb?
Coraz więcej problemów z plikiem mdf TempDB
Znajdź transakcje wypełniające sklep z wersjami
Pisałem także o tym na blogu, korzystając ze niestandardowej sesji Extended Events, aby śledzić te informacje w programie SQL Server 2012 i nowszych:
A Paul White pisał na blogu o bezpośrednim czytaniu stron (nie do końca dla osób o słabym sercu, ani łatwych do zautomatyzowania w jakikolwiek sposób):
źródło
Oto zapytanie, które powinno zacząć od znalezienia poszukiwanych informacji:
To zapytanie pobiera przydatne informacje dla 10 najważniejszych zadań, takich jak strony przydzielone / cofnięte, tekst SQL zadań (jeśli są dostępne) itp.
Te DMV są pełne świetnych informacji, więc jeśli potrzebujesz więcej danych, możesz mieszać i dopasowywać do tego, co wyciągasz. Ale powinien to być punkt wyjścia do rozwiązywania problemów z bieżącymi zadaniami zużycia tempdb.
źródło
tempdb.sys.dm_db_partition_stats
. Niestety tak naprawdę nie możesz powiedzieć, która kopia#some_table_name
należy do którego użytkownika, ani nie zawsze będziesz w stanie wyciągnąć tekstu instrukcji, który odwołuje się do tej tabeli w danym momencie - może to nie być zapytanie, które użytkownik aktualnie wykonuje. Może i chcesz zobaczyć to i to