Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op: SQL Server 2016 (13.x) en latere versies
van Azure SQL Database
Azure 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.
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));