sys.dm_db_stats_histogram (T-SQL)

Berlaku untuk: SQL Server 2016 (13.x) dan Azure SQL DatabaseAzure 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_iddan 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.

Image of how a histogram is calculated from sampled column values.

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_histogramstat_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)