Delen via


sys.dm_db_stats_histogram (Transact-SQL)

Van toepassing op: SQL Server 2016 (13.x) en latere versies van Azure SQL DatabaseAzure SQL Managed Instance

Retourneert het histogram voor statistieken voor het opgegeven databaseobject (tabel of geïndexeerde weergave) in de huidige SQL Server-database. Vergelijkbaar met DBCC SHOW_STATISTICS WITH HISTOGRAM.

Opmerking

Deze DMF is beschikbaar vanaf SQL Server 2016 (13.x) SP1 CU2

Syntaxis

sys.dm_db_stats_histogram (object_id , stats_id)

Arguments

object_id

De id van het object in de huidige database waarvoor eigenschappen van een van de statistieken worden aangevraagd. object_id is int.

stats_id

De id van statistieken voor de opgegeven object_id. De statistieken-id kan worden verkregen vanuit de dynamische beheerweergave sys.stats . stats_id is int.

Tabel geretourneerd

Kolomnaam Gegevenstype Description
object_id int Id van het object (tabel of geïndexeerde weergave) waarvoor de eigenschappen van het statistiekenobject moeten worden geretourneerd.
stats_id int Id van het statistiekenobject. Is uniek in de tabel of geïndexeerde weergave. Zie sys.stats voor meer informatie.
step_number int Het aantal stappen in het histogram.
range_high_key sql_variant Bovengrenskolomwaarde voor een histogramstap. De kolomwaarde wordt ook wel een sleutelwaarde genoemd.
range_rows werkelijk Geschat aantal rijen waarvan de kolomwaarde binnen een histogramstap valt, met uitzondering van de bovengrens.
equal_rows werkelijk Geschat aantal rijen waarvan de kolomwaarde gelijk is aan de bovengrens van de histogramstap.
distinct_range_rows bigint Geschat aantal rijen met een afzonderlijke kolomwaarde binnen een histogramstap, met uitzondering van de bovengrens.
average_range_rows werkelijk Het gemiddelde aantal rijen met dubbele kolomwaarden binnen een histogramstap, met uitzondering van de bovengrens (RANGE_ROWS / DISTINCT_RANGE_ROWS voor DISTINCT_RANGE_ROWS > 0).

Opmerkingen

De resultatenset voor sys.dm_db_stats_histogram retourneert informatie die vergelijkbaar is met DBCC SHOW_STATISTICS WITH HISTOGRAM en bevat object_idook , stats_iden step_number.

Omdat de kolom range_high_key een sql_variant gegevenstype is, moet u mogelijk een predicaat gebruiken CAST of CONVERT als een predicaat een vergelijking met een niet-tekenreeksconstante doet.

Histogram

Een histogram meet de frequentie van het optreden voor elke afzonderlijke waarde in een gegevensset. De queryoptimalisatie berekent een histogram op de kolomwaarden in de eerste sleutelkolom van het statistiekenobject, waarbij de kolomwaarden worden geselecteerd door de rijen statistisch te nemen of door een volledige scan van alle rijen in de tabel of weergave uit te voeren. Als het histogram wordt gemaakt op basis van een steekproefset rijen, zijn de opgeslagen totalen voor het aantal rijen en het aantal afzonderlijke waarden schattingen en hoeven ze geen gehele gehele getallen te zijn.

Als u het histogram wilt maken, worden de kolomwaarden door de queryoptimalisatie gesorteerd, wordt het aantal waarden berekend dat overeenkomt met elke afzonderlijke kolomwaarde en worden de kolomwaarden vervolgens samengevoegd tot maximaal 200 aaneengesloten histogramstappen. Elke stap bevat een bereik van kolomwaarden gevolgd door een bovengrenskolomwaarde. Het bereik bevat alle mogelijke kolomwaarden tussen grenswaarden, met uitzondering van de grenswaarden zelf. Het laagste van de gesorteerde kolomwaarden is de bovenste grenswaarde voor de eerste histogramstap.

In het volgende diagram ziet u een histogram met zes stappen. Het gebied links van de eerste bovengrenswaarde is de eerste stap.

Diagram van hoe een histogram wordt berekend op basis van waarden in de steekproefkolom.

Voor elke histogramstap:

  • Vetgedrukte lijn vertegenwoordigt de bovengrenswaarde (range_high_key) en het aantal keren dat deze voorkomt (equal_rows)

  • Effen gebied links van range_high_key vertegenwoordigt het bereik van kolomwaarden en het gemiddelde aantal keren dat elke kolomwaarde voorkomt (average_range_rows). De average_range_rows voor de eerste histogramstap is altijd 0.

  • Stippellijnen vertegenwoordigen de voorbeeldwaarden die worden gebruikt om het totale aantal afzonderlijke waarden in het bereik (distinct_range_rows) en het totale aantal waarden in het bereik (range_rows) te schatten. De queryoptimalisatie gebruikt range_rows en distinct_range_rows om average_range_rows te berekenen en slaat de voorbeeldwaarden niet op.

De queryoptimalisatie definieert de histogramstappen op basis van hun statistische significantie. Er wordt een maximumverschil algoritme gebruikt om het aantal stappen in het histogram te minimaliseren en tegelijkertijd het verschil tussen de grenswaarden te maximaliseren. Het maximum aantal stappen is 200. Het aantal histogramstappen kan kleiner zijn dan het aantal afzonderlijke waarden, zelfs voor kolommen met minder dan 200 grenspunten. Een kolom met 100 afzonderlijke waarden kan bijvoorbeeld een histogram met minder dan 100 grenspunten hebben.

Permissions

Vereist dat de gebruiker machtigingen heeft voor statistiekenkolommen of dat de gebruiker eigenaar is van de tabel of dat de gebruiker lid is van de vaste serverrol sysadmin , de db_owner vaste databaserol of de db_ddladmin vaste databaserol.

Voorbeelden

Eén. Basisvoorbeeld

In het volgende voorbeeld wordt een basistabel gemaakt en gevuld. Vervolgens maakt u statistieken op de 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);

De primaire sleutel neemt nummer 1 in beslagstat_id, dus roep sys.dm_db_stats_histogramstat_id nummer 2 op om het histogram met statistieken voor de Region tabel te retourneren.

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

B. Nuttige query

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

In het volgende voorbeeld wordt een tabel Region geselecteerd met een predicaat op kolom Region_Name.

SELECT * FROM Region
WHERE Region_Name = 'Canada';

In het volgende voorbeeld wordt gekeken naar de eerder gemaakte statistiek in tabel Region en kolom Region_Name voor de histogramstap die overeenkomt met het predicaat in de bovenstaande query.

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