Bagikan melalui


sys.dm_db_stats_histogram (T-SQL)

Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru Azure SQL DatabaseAzure SQL Managed Instance SQL databasedi Microsoft Fabric

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

ID objek dalam database saat ini tempat properti salah satu statistiknya diminta. object_id int.

stats_id

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.
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.

Diagram cara histogram dihitung dari nilai kolom sampel.

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 peran server tetap sysadmin , peran database tetap db_owner , atau peran database tetap db_ddladmin .

Contoh

J. Contoh dasar

Contoh berikut membuat dan mengisi tabel dasar. Kemudian membuat statistik pada Region_Name kolom.

CREATE TABLE Region
(
    Region_ID INT IDENTITY PRIMARY KEY,
    Region_Name VARCHAR (120) NOT NULL
);

INSERT Region (Region_Name)
VALUES ('Canada'), ('Denmark'), ('Iceland'), ('Peru');

CREATE STATISTICS Region_Stats ON Region(Region_Name);

Kunci primer menempati stat_id nomor 1, jadi panggil sys.dm_db_stats_histogramstat_id nomor 2, untuk mengembalikan histogram statistik untuk Region tabel.

SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID('Region'), 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 Region dengan predikat pada kolom Region_Name.

SELECT * FROM Region
WHERE Region_Name = 'Canada';

Contoh berikut melihat statistik yang dibuat sebelumnya pada tabel Region dan kolom Region_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 AS ss
     INNER JOIN sys.stats_columns AS sc
         ON ss.stats_id = sc.stats_id
        AND ss.object_id = sc.object_id
     INNER JOIN sys.all_columns AS 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) AS shr
CROSS APPLY sys.dm_db_stats_histogram(ss.object_id, ss.stats_id) AS sh
WHERE ss.[object_id] = OBJECT_ID('Region')
      AND ac.name = 'Region_Name'
      AND sh.range_high_key = CAST ('Canada' AS CHAR (8));