Di mana statistik yang digunakan oleh Pengoptimal Kueri disimpan secara fisik di dalam file database SQL Server dan Buffer Pool?
Lebih khusus lagi, apakah ada cara untuk mencari tahu halaman yang digunakan oleh statistik menggunakan DMV dan / atau DBCC?
Saya memiliki SQL Server 2008 Internal dan SQL Server Internal dan buku Pemecahan Masalah dan tidak ada yang berbicara tentang struktur fisik statistik; jika mereka melakukannya saya belum dapat menemukan informasi ini.
STATS_STREAM
saya tidak pernah melihat apakah ini adalah sesuatu yang dapat ditemukan dalam file itu sendiri.StatMan
) yang menampilkan gumpalan (ironisnya, nama itu disorot sebagai fungsi di jendela permintaan SSMS). Secara logis, statistik dikaitkan dengan indeks atau seperangkat kolom tabel, jadi saya akan mulai dengan memeriksa tabel metadata internal mencaribinary
atauvarbinary
kolom yang akan mengarah ke gumpalan. Ini harus dapat dilihat menggunakanDBCC PAGE
, tetapi mungkin tidak dengan cara lain karena semuanya internal.sysindexes.statblob
tetapi sejak 2005 yang kembaliNULL
dan lokasi benar-benar tidak berdokumen, hanya dapat diambil (yang saya tahu) melaluiDBCC SHOW_STATISTICS(o, i) WITH STATS_STREAM;
.sys.sysidxstats
- sepertinya ada LOB pointer di tabel itu. Saya tidak yakin di mana statistik kolom belum; mereka bisa berada di tabel itu juga adatype
kolom.Jawaban:
Menemukan mereka
Buat tabel dengan objek statistik sederhana.
Hubungkan menggunakan DAC (
ADMIN:Server[\instance]
).Jalankan pertanyaan berikut:
Anda akan mencatat bahwa
imageval
untuk setiap objek statistik tidak sama dengan gumpalan stats, tetapi itu berisi gumpalan stats - itu hanya offset. Pada sistem saya ini menghasilkan ini untuk x (saya jelas terpotong sedikit bit):Dan ini untukmu:
Hal yang sama berlaku untuk statistik berbasis indeks.
Anda mungkin bisa melakukan validasi lebih lanjut dengan serangkaian pertanyaan menggunakan
DBCC
perintah. Pertama, cari halaman yang terlibat dengan indeks berkerumun disys.sysobjvalues
(gantilah nama basis data Anda):Hasilnya akan mencantumkan banyak halaman, Anda tertarik pada halaman
PageType = 1
. Dengan database baru, Anda harus dapat menemukan info ini di salah satu halaman dengan nilai tertinggiPagePID
. Misalnya pada sistem saya ini halaman 281, jadi saya melihat lebih dekat ke halaman itu:Benar saja, saya menemukan data di slot 17:
(Pada basis data yang lebih besar, Anda mungkin harus melakukan lebih banyak perburuan dan mematuk, karena tidak ada jaminan bahwa objek statistik baru akan berakhir pada halaman (er) baru.)
Silakan dan coba ini di rumah, tetapi ada alasan Anda perlu terhubung dengan DAC untuk ini. Saya ingin tahu, tentu saja, apa yang akan Anda lakukan dengan informasi ini yang tidak dapat Anda lakukan
DBCC SHOW_STATISTICS
output.Perhatikan bahwa ini tentu saja tidak mencoba untuk memecahkan kode
STATS_STREAM
untuk memberikan histogram atau informasi lainnya, dan saya tidak dapat menemukan bukti bahwa output tabularDBCC SHOW_STATISTICS ... WITH HISTOGRAM
disimpan di mana saja dalam format tabel. Joe Chang memiliki beberapa informasi tentang decoding jika itu yang Anda cari. Saya tidak berpikir itu adalah sesuatu yang ingin Anda lakukan dalam permintaan - cukup gunakanDBCC
.sumber