sys.dm_db_stats_histogram (T-SQL)
Berlaku untuk: SQL Server 2016 (13.x) dan Azure SQL Database Azure SQL Managed Instance yang lebih baru
Mengembalikan histogram statistik untuk objek database yang ditentukan (tabel atau tampilan terindeks) dalam database SQL Server saat ini. Mirip dengan DBCC SHOW_STATISTICS WITH HISTOGRAM
.
Catatan
DMF ini tersedia dimulai dengan SQL Server 2016 (13.x) SP1 CU2
Sintaks
sys.dm_db_stats_histogram (object_id, stats_id)
Argumen
object_id
Adalah ID objek dalam database saat ini yang properti salah satu statistiknya diminta. object_id int.
stats_id
Adalah ID statistik untuk object_id yang ditentukan. ID statistik dapat diperoleh dari tampilan manajemen dinamis sys.stats . stats_id int.
Tabel Dikembalikan
Nama kolom | Jenis data | Deskripsi |
---|---|---|
object_id | int | ID objek (tabel atau tampilan terindeks) untuk mengembalikan properti objek statistik. |
stats_id | int | ID objek statistik. Unik dalam tabel atau tampilan terindeks. Untuk informasi selengkapnya, lihat sys.stats (Transact-SQL). |
step_number | int | Jumlah langkah dalam histogram. |
range_high_key | aql_variant | Nilai kolom terikat atas untuk langkah histogram. Nilai kolom juga disebut nilai kunci. |
range_rows | real | Perkiraan jumlah baris yang nilai kolomnya berada dalam langkah histogram, tidak termasuk batas atas. |
equal_rows | real | Perkiraan jumlah baris yang nilai kolomnya sama dengan batas atas langkah histogram. |
distinct_range_rows | bigint | Perkiraan jumlah baris dengan nilai kolom yang berbeda dalam langkah histogram, tidak termasuk batas atas. |
average_range_rows | real | Jumlah rata-rata baris dengan nilai kolom duplikat dalam langkah histogram, tidak termasuk batas atas (RANGE_ROWS / DISTINCT_RANGE_ROWS untuk DISTINCT_RANGE_ROWS > 0 ). |
Keterangan
Hasil untuk sys.dm_db_stats_histogram
mengembalikan informasi yang mirip DBCC SHOW_STATISTICS WITH HISTOGRAM
dengan dan juga mencakup object_id
, , stats_id
dan step_number
.
Karena kolom range_high_key
adalah jenis data sql_variant, Anda mungkin perlu menggunakan CAST
atau CONVERT
jika predikat melakukan perbandingan dengan konstanta non-string.
Histogram
Histogram mengukur frekuensi kemunculan untuk setiap nilai yang berbeda dalam himpunan data. Pengoptimal kueri menghitung histogram pada nilai kolom di kolom kunci pertama objek statistik, memilih nilai kolom dengan mengambil sampel baris secara statistik atau dengan melakukan pemindaian penuh semua baris dalam tabel atau tampilan. Jika histogram dibuat dari sekumpulan baris sampel, total yang disimpan untuk jumlah baris dan jumlah nilai yang berbeda adalah perkiraan dan tidak perlu berupa bilangan bulat utuh.
Untuk membuat histogram, pengoptimal kueri mengurutkan nilai kolom, menghitung jumlah nilai yang cocok dengan setiap nilai kolom yang berbeda lalu menggabungkan nilai kolom ke dalam maksimal 200 langkah histogram berdekatan. Setiap langkah menyertakan rentang nilai kolom diikuti dengan nilai kolom terikat atas. Rentang ini mencakup semua nilai kolom yang mungkin di antara nilai batas, tidak termasuk nilai batas itu sendiri. Nilai kolom terendah yang diurutkan adalah nilai batas atas untuk langkah histogram pertama.
Diagram berikut menunjukkan histogram dengan enam langkah. Area di sebelah kiri nilai batas atas pertama adalah langkah pertama.
Untuk setiap langkah histogram:
Garis tebal mewakili nilai batas atas (range_high_key) dan berapa kali terjadi (equal_rows)
Area solid kiri range_high_key mewakili rentang nilai kolom dan jumlah rata-rata setiap nilai kolom terjadi (average_range_rows). Average_range_rows untuk langkah histogram pertama selalu 0.
Garis putus-putus mewakili nilai sampel yang digunakan untuk memperkirakan jumlah total nilai yang berbeda dalam rentang (distinct_range_rows) dan jumlah total nilai dalam rentang (range_rows). Pengoptimal kueri menggunakan range_rows dan distinct_range_rows untuk menghitung average_range_rows dan tidak menyimpan nilai sampel.
Pengoptimal kueri menentukan langkah-langkah histogram sesuai dengan signifikansi statistiknya. Ini menggunakan algoritma perbedaan maksimum untuk meminimalkan jumlah langkah dalam histogram sambil memaksimalkan perbedaan antara nilai batas. Jumlah maksimum langkah adalah 200. Jumlah langkah histogram dapat kurang dari jumlah nilai yang berbeda, bahkan untuk kolom dengan kurang dari 200 titik batas. Misalnya, kolom dengan 100 nilai berbeda dapat memiliki histogram dengan kurang dari 100 titik batas.
Izin
Mengharuskan pengguna memilih izin pada kolom statistik atau pengguna memiliki tabel atau pengguna adalah anggota sysadmin
peran server tetap, db_owner
peran database tetap, atau db_ddladmin
peran database tetap.
Contoh
J. Contoh sederhana
Contoh berikut membuat dan mengisi tabel sederhana. Kemudian membuat statistik pada Country_Name
kolom.
CREATE TABLE Country
(Country_ID int IDENTITY PRIMARY KEY,
Country_Name varchar(120) NOT NULL);
INSERT Country (Country_Name) VALUES ('Canada'), ('Denmark'), ('Iceland'), ('Peru');
CREATE STATISTICS Country_Stats
ON Country (Country_Name) ;
Kunci primer menempati stat_id
nomor 1, jadi panggil sys.dm_db_stats_histogram
stat_id
nomor 2, untuk mengembalikan histogram statistik untuk Country
tabel.
SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID('Country'), 2);
B. Kueri yang berguna:
SELECT hist.step_number, hist.range_high_key, hist.range_rows,
hist.equal_rows, hist.distinct_range_rows, hist.average_range_rows
FROM sys.stats AS s
CROSS APPLY sys.dm_db_stats_histogram(s.[object_id], s.stats_id) AS hist
WHERE s.[name] = N'<statistic_name>';
C. Kueri yang berguna:
Contoh berikut memilih dari tabel Country
dengan predikat pada kolom Country_Name
.
SELECT * FROM Country
WHERE Country_Name = 'Canada';
Contoh berikut melihat statistik yang dibuat sebelumnya pada tabel Country
dan kolom Country_Name
untuk langkah histogram yang cocok dengan predikat dalam kueri di atas.
SELECT ss.name, ss.stats_id, shr.steps, shr.rows, shr.rows_sampled,
shr.modification_counter, shr.last_updated, sh.range_rows, sh.equal_rows
FROM sys.stats ss
INNER JOIN sys.stats_columns sc
ON ss.stats_id = sc.stats_id AND ss.object_id = sc.object_id
INNER JOIN sys.all_columns ac
ON ac.column_id = sc.column_id AND ac.object_id = sc.object_id
CROSS APPLY sys.dm_db_stats_properties(ss.object_id, ss.stats_id) shr
CROSS APPLY sys.dm_db_stats_histogram(ss.object_id, ss.stats_id) sh
WHERE ss.[object_id] = OBJECT_ID('Country')
AND ac.name = 'Country_Name'
AND sh.range_high_key = CAST('Canada' AS CHAR(8));
Langkah berikutnya
DBCC SHOW_STATISTICS (Transact-SQL)
Tampilan dan Fungsi Manajemen Dinamis Terkait Objek (Transact-SQL)
sys.dm_db_stats_properties (T-SQL)