Aracılığıyla paylaş


sys.dm_db_stats_histogram (Transact-SQL)

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümler Azure SQL DatabaseAzure SQL Managed InstanceSQL 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.

Uyarı

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

Sözdizimi

sys.dm_db_stats_histogram (object_id , stats_id)

Arguments

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 döndürüldü

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ğeri olarak da adlandırılır.
range_rows gerçek Sütun değeri histogram adımında olan ve üst sınır hariç olan tahmini satır sayısı.
equal_rows gerçek Sütun değeri histogram adımının üst sınırına eşit olan 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 gerçek 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 Grafiği

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ç, sınır değerleri arasındaki 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.

Örnekler

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