Saya berharap untuk mendapatkan tampilan terperinci dari file database mana yang berisi unit alokasi mana untuk berbagai HoBT (baik yang selaras maupun tidak selaras) yang hidup dalam database.
Kueri yang selalu saya gunakan (lihat di bawah) telah membantu saya dengan baik sampai kami mulai membuat beberapa file data per filegroup dan saya hanya bisa mengetahui cara mendapatkan granular seperti pada level filegroup.
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;
Namun, kueri ini tidak akan berfungsi ketika ada beberapa file dalam sebuah grup file karena saya hanya bisa sejauh menghubungkan unit alokasi ke ruang data dan, pada akhirnya, sebuah grup file. Saya ingin tahu apakah ada DMV atau katalog lain yang saya lewatkan yang dapat saya gunakan untuk mengidentifikasi lebih lanjut file mana dalam filegroup yang berisi unit alokasi.
Pertanyaan di balik pertanyaan ini adalah bahwa saya mencoba untuk mengevaluasi efek aktual dari kompresi struktur yang dipartisi. Saya tahu saya bisa melakukan sebelum dan sesudah menggunakan FILEPROPERTY(FileName,'SpaceUsed')
untuk file dan sebelum dan sesudah sys.allocation_units.used_pages/128.
untuk mendapatkan informasi ini, tetapi latihan itu sendiri membuat saya bertanya-tanya apakah saya bisa mengidentifikasi file tertentu yang berisi unit alokasi tertentu.
Saya telah bermain-main dengan %%physloc%%
harapan itu bisa membantu, tetapi itu tidak cukup untuk mendapatkan apa yang saya cari. Tautan di bawah ini disediakan oleh Aaron Bertrand :
Jawaban:
Coba kueri berikut. Pertama-tama membuat tabel sementara lokal dan kemudian mengisinya dengan asosiasi AllocationUnitID-to-FileID yang ditemukan di
sys.dm_db_database_page_allocations
, Fungsi Manajemen Dinamis (DMF) tidak berdokumen yang diperkenalkan di SQL Server 2012 (untuk versi sebelum 2012, Anda bisa mendapatkan info ini dariDBCC IND()
). Tabel temp lokal itu kemudian BERGABUNG ke dalam versi modifikasi dari kueri asli.Data dari DMF itu ditempatkan ke dalam tabel sementara untuk kinerja karena, tergantung pada ukuran database, itu bisa memakan waktu lebih dari beberapa detik untuk mendapatkan data itu. Kata
DISTINCT
kunci digunakan karena DMF mengembalikan satu baris per halaman data, dan ada beberapa halaman data per setiap unit alokasi.Saya meninggalkan-GABUNG data itu ke dalam kueri asli karena kueri asli mengembalikan unit alokasi yang memiliki 0 halaman data (biasanya
ROW_OVERFLOW_DATA
danLOB_DATA
jenis). Saya juga menambahkantotal_pages
bidang sehingga akan lebih mudah untuk menghubungkan titik data ke baris yang adaNULL
untuk File Data. Jika Anda tidak peduli dengan Unit Alokasi yang memiliki 0 baris, maka tidak apa-apa untuk mengubahnyaLEFT JOIN
menjadiINNER JOIN
.sumber
Remus Rusanu, pada 21 Mei 2013, memberikan jawaban untuk pertanyaan ini:
Satu filegroup, banyak datafile, cara mendapatkan daftar tabel di setiap file
Jawabannya adalah:
sumber