Miałem nadzieję uzyskać szczegółowy widok, które pliki bazy danych zawierały, które jednostki alokacji dla różnych HoBT (zarówno wyrównanych, jak i niezrównanych) żyjących w bazie danych.
Zapytanie, którego zawsze używałem (patrz poniżej), dobrze mi służyło, dopóki nie zaczęliśmy tworzyć wielu plików danych na grupę plików i jestem w stanie dowiedzieć się, jak uzyskać stopień szczegółowości na poziomie grupy plików.
select
SchemaName = sh.name,
TableName = t.name,
IndexName = i.name,
PartitionNumber = p.partition_number,
IndexID = i.index_id,
IndexDataspaceID = i.data_space_id,
AllocUnitDataspaceID = au.data_space_id,
PartitionRows = p.rows
from sys.allocation_units au
join sys.partitions p
on au.container_id = p.partition_id
join sys.indexes i
on i.object_id = p.object_id
and i.index_id = p.index_id
join sys.tables t
on p.object_id = t.object_id
join sys.schemas sh
on t.schema_id = sh.schema_id
where sh.name != 'sys'
and au.type = 2
union all
select
sh.name,
t.name,
i.name,
p.partition_number,
i.index_id,
i.data_space_id,
au.data_space_id,
p.rows
from sys.allocation_units au
join sys.partitions p
on au.container_id = p.hobt_id
join sys.indexes i
on i.object_id = p.object_id
and i.index_id = p.index_id
join sys.tables t
on p.object_id = t.object_id
join sys.schemas sh
on t.schema_id = sh.schema_id
where sh.name != 'sys'
and au.type in (1,3)
order by t.name, i.index_id,p.partition_number;
Jednak to zapytanie nie będzie działać, gdy w grupie plików jest wiele plików, ponieważ mogę uzyskać tylko tyle, aby powiązać jednostkę alokacji z przestrzenią danych i, ostatecznie, aplikacjami. Chciałbym wiedzieć, czy istnieje inny DMV lub katalog, którego mi brakuje, którego mogę użyć do dalszego zidentyfikowania, który plik w grupie plików zawiera jednostkę alokacji.
Pytanie kryjące się za tym pytaniem polega na tym, że próbuję ocenić rzeczywiste skutki kompresji struktur partycjonowanych. Wiem, że mogę użyć pliku przed i po FILEPROPERTY(FileName,'SpaceUsed')
nim oraz przed i po, sys.allocation_units.used_pages/128.
aby uzyskać te informacje, ale samo ćwiczenie sprawiło, że zastanawiałem się, czy mogę zidentyfikować konkretny plik zawierający określoną jednostkę alokacji.
Mieszałem się %%physloc%%
w nadziei, że to może pomóc, ale nie do końca rozumiem, czego szukam. Poniższe linki zostały dostarczone przez Aarona Bertranda :
Odpowiedzi:
Wypróbuj następujące zapytanie. Najpierw tworzy lokalną tabelę tymczasową, a następnie zapełnia ją powiązaniami AllocationUnitID-to-FileID znajdującymi się w
sys.dm_db_database_page_allocations
nieudokumentowanej funkcji zarządzania dynamicznego (DMF) wprowadzonej w SQL Server 2012 (dla wersji wcześniejszych niż 2012, można uzyskać te informacje zDBCC IND()
). Lokalna tabela temp jest następnie ŁĄCZONA w zmodyfikowaną wersję pierwotnego zapytania.Dane z tego DMF są umieszczane w tabeli tymczasowej w celu zwiększenia wydajności, ponieważ w zależności od wielkości bazy danych uzyskanie tych danych może zająć więcej niż kilka sekund. Słowo
DISTINCT
kluczowe jest używane, ponieważ DMF zwraca jeden wiersz na stronę danych, a na każdą jednostkę alokacji przypada wiele stron danych.Dołączyłem te dane do pierwotnego zapytania, ponieważ pierwotne zapytanie zwraca jednostki alokacji, które mają 0 stron danych (zazwyczaj
ROW_OVERFLOW_DATA
iLOB_DATA
typy). Dodałem równieżtotal_pages
pole, aby łatwiej było powiązać ten punkt danych z wierszami zawierającymiNULL
s dla plików danych. Jeśli nie przejmujesz się jednostkami alokacji, które mają 0 wierszy, dobrze byłoby zmienić toLEFT JOIN
naINNER JOIN
.źródło
Remus Rusanu, 21 maja 2013 r., Udzielił odpowiedzi na to pytanie:
Jedna grupa plików, wiele plików danych, jak uzyskać listę tabel w każdym pliku
Jego odpowiedź brzmiała:
źródło