sys.dm_db_stats_histogram (Transact-SQL)

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümler Azure SQL VeritabanıAzure SQL Yönetilen ÖrneğiSQL database in Microsoft Fabric

Geçerli SQL Server veritabanında belirtilen veritabanı nesnesi (tablo veya dizinli görünüm) için istatistik histogramını döndürür. Şunun gibi DBCC SHOW_STATISTICS WITH HISTOGRAM.

Note

Bu DMF, SQL Server 2016 (13.x) SP1 CU2 ile başlayarak kullanılabilir

Syntax

sys.dm_db_stats_histogram (object_id , stats_id)

Argümanlar

object_id

Geçerli veritabanında istatistiklerinden birinin özelliklerinin istendiği nesnenin kimliği. object_idint.

stats_id

Belirtilen object_id için istatistiklerin kimliği. İstatistik kimliği sys.stats dinamik yönetim görünümünden alınabilir. stats_idint.

Tablo geri getirildi

Sütun adı Veri türü Description
object_id int İstatistik nesnesinin özelliklerinin döndürüleceği nesnenin kimliği (tablo veya dizinli görünüm).
stats_id int İstatistik nesnesinin kimliği. Tablo veya dizinli görünüm içinde benzersizdir. Daha fazla bilgi için bkz. sys.stats.
step_number int Histogramdaki adım sayısı.
range_high_key sql_variant Histogram adımı için üst sınır sütun değeri. Sütun değeri, anahtar değer olarak da adlandırılır.
range_rows real Histogram adımının kapsamına giren ve üst sınır dahil olmayan sütun değerine sahip tahmini satır sayısı.
equal_rows real Histogram adımının üst sınırına eşit olan sütun değerine sahip tahmini satır sayısı.
distinct_range_rows bigint Histogram adımında, üst sınır hariç ayrı sütun değerine sahip tahmini satır sayısı.
average_range_rows real Histogram adımında yinelenen sütun değerlerine sahip ortalama satır sayısı( içinRANGE_ROWS / DISTINCT_RANGE_ROWS) üst sınırDISTINCT_RANGE_ROWS > 0 hariç.

Açıklamalar

için sys.dm_db_stats_histogram sonuç kümesi , ve gibi DBCC SHOW_STATISTICS WITH HISTOGRAM bilgileri döndürür ve object_idiçerirstats_idstep_number.

Sütun range_high_key bir sql_variant veri türü olduğundan, bir koşul dize olmayan sabitle karşılaştırma yaparsa veya CAST kullanmanız CONVERT gerekebilir.

Histogram

Histogram, bir veri kümesindeki her ayrı değer için oluşum sıklığını ölçer. Sorgu iyileştiricisi, istatistik nesnesinin ilk anahtar sütunundaki sütun değerleri üzerinde bir histogram hesaplar, satırlarda istatistiksel örnekleme yaparak veya tablodaki veya görünümdeki tüm satırların tam taramasını yaparak sütun değerlerini seçer. Histogram örneklenmiş bir satır kümesinden oluşturulduysa, satır sayısı ve ayrı değer sayısı için depolanan toplamlar tahmindir ve tamsayı olması gerekmez.

Histogramı oluşturmak için sorgu iyileştiricisi sütun değerlerini sıralar, her ayrı sütun değeriyle eşleşen değerlerin sayısını hesaplar ve sonra sütun değerlerini en fazla 200 bitişik histogram adımında toplar. Her adım, bir sütun değerleri aralığı ve ardından bir üst sınır sütun değeri içerir. Aralık, sınır değerlerinin kendileri hariç olmak üzere, sınır değerleri arasında yer alan tüm olası sütun değerlerini içerir. Sıralanmış sütun değerlerinin en alt kısmı, ilk histogram adımının üst sınır değeridir.

Aşağıdaki diyagramda altı adımlı bir histogram gösterilmektedir. İlk üst sınır değerinin solundaki alan ilk adımdır.

Örneklenen sütun değerlerinden histogramın nasıl hesaplanmış olduğunu gösteren diyagram.

Her histogram adımı için:

  • Kalın çizgi, üst sınır değerini (range_high_key) ve oluşma sayısını (equal_rows) temsil eder

  • range_high_key'nin düz alanı, sütun değerleri aralığını ve her sütun değerinin ortalama kaç kez gerçekleştiğini (average_range_rows) temsil eder. İlk histogram adımının average_range_rows her zaman 0'dır.

  • Noktalı çizgiler, aralıktaki benzersiz değerlerin toplam sayısını (distinct_range_rows) ve aralıktaki toplam değer sayısını (range_rows) tahmin etmek için kullanılan örneklenmiş değerleri temsil eder. Sorgu iyileştiricisi , average_range_rows hesaplamak için range_rows ve distinct_range_rows kullanır ve örneklenen değerleri depolamaz.

Sorgu iyileştiricisi histogram adımlarını istatistiksel anlamlarına göre tanımlar. Sınır değerleri arasındaki farkı en üst düzeye çıkarırken histogramdaki adım sayısını en aza indirmek için maksimum fark algoritması kullanır. Adım sayısı üst sınırı 200'dür. Histogram adımlarının sayısı, 200'den az sınır noktasına sahip sütunlar için bile farklı değerlerin sayısından daha az olabilir. Örneğin, 100 ayrı değeri olan bir sütunda 100'den az sınır noktası içeren bir histogram olabilir.

Permissions

Kullanıcının istatistik sütunlarında belirli izinlere sahip olmasını veya tablonun sahibi veya kullanıcının sysadmin sabit sunucu rolünün, db_owner sabit veritabanı rolünün veya db_ddladmin sabit veritabanı rolünün üyesi olmasını gerektirir.

Examples

A. Temel örnek

Aşağıdaki örnek temel bir tablo oluşturur ve doldurur. Ardından sütunda Region_Name istatistikler oluşturur.

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

Birincil anahtar 1 numarayı kaplarstat_id, bu nedenle tablonun istatistik histogramını döndürmek için sys.dm_db_stats_histogram 2 numaralı numarayı çağırın stat_idRegion.

SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID('Region'), 2);

B. Yararlı sorgu

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. Yararlı sorgu

Aşağıdaki örnek, sütununda Regionkoşulu olan tablodan Region_Name öğesini seçer.

SELECT * FROM Region
WHERE Region_Name = 'Canada';

Aşağıdaki örnekte yukarıdaki sorgudaki koşulla eşleşen histogram adımı için tablo Region ve sütunda Region_Name daha önce oluşturulmuş istatistikler yer alır.

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
OUTER 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));