Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Vonatkozik a következőkre: SQL Server 2016 (13.x) és későbbi verziók
Azure SQL Database
Azure SQL Managed Instance
SQL database in Microsoft Fabric
Az aktuális SQL Server-adatbázisban megadott adatbázis-objektum (tábla vagy indexelt nézet) statisztikai hisztogramját adja vissza. Hasonló aDBCC SHOW_STATISTICS WITH HISTOGRAM.
Megjegyzés:
Ez a DMF az SQL Server 2016 -tól (13.x) SP1 CU2-től érhető el
Szemantika
sys.dm_db_stats_histogram (object_id , stats_id)
Arguments
object_id
Annak az objektumnak az azonosítója az aktuális adatbázisban, amelyhez az egyik statisztikájának tulajdonságait kéri a rendszer. object_idint.
stats_id
A megadott object_id statisztikáinak azonosítója. A statisztikai azonosító a sys.stats dinamikus felügyeleti nézetből kérhető le. stats_idint.
Visszaadott tábla
| Oszlop név | Adattípus | Description |
|---|---|---|
object_id |
int | Annak az objektumnak (tábla vagy indexelt nézet) az azonosítója, amelyhez a statisztikai objektum tulajdonságait szeretné visszaadni. |
stats_id |
int | A statisztikai objektum azonosítója. A tábla vagy az indexelt nézet egyedi. További információ: sys.stats. |
step_number |
int | A hisztogramban szereplő lépés száma. |
range_high_key |
sql_variant | Hisztogramlépés felső kötött oszlopértéke. Az oszlopértéket kulcsértéknek is nevezik. |
range_rows |
valódi | Azon sorok becsült száma, amelyek oszlopértéke egy hisztogramlépésen belül esik, a felső korlát kivételével. |
equal_rows |
valódi | Azon sorok becsült száma, amelyek oszlopértéke megegyezik a hisztogram lépés felső határával. |
distinct_range_rows |
bigint | A hisztogramlépésen belül eltérő oszlopértékkel rendelkező sorok becsült száma, a felső kötött kivételével. |
average_range_rows |
valódi | Az ismétlődő oszlopértékeket tartalmazó sorok átlagos száma egy hisztogramlépésen belül, a felső kötött (RANGE_ROWS / DISTINCT_RANGE_ROWS a következőhöz DISTINCT_RANGE_ROWS > 0) kivételével. |
Megjegyzések
Az eredményhalmaz a sys.dm_db_stats_histogram következőhöz DBCC SHOW_STATISTICS WITH HISTOGRAM hasonló adatokat ad vissza, és azokat is tartalmazza object_id: , stats_idés step_number.
Mivel az oszlop range_high_key egy sql_variant adattípus, lehet, hogy használnia CAST kell, vagy CONVERT ha egy predikátum nem sztringállandóval hasonlít össze.
Hisztogram
A hisztogram az adathalmaz minden egyes különböző értékének előfordulási gyakoriságát méri. A lekérdezésoptimalizáló kiszámítja a statisztikai objektum első kulcsoszlopában lévő oszlopértékek hisztogramját, az oszlopértékeket a sorok statisztikai mintavételezésével vagy a tábla vagy nézet összes sorának teljes vizsgálatával választja ki. Ha a hisztogram egy mintául szolgáló sorkészletből jön létre, a sorok számának és a különböző értékek számának tárolt összegei becslések, és nem kell egész egész számoknak lenniük.
A hisztogram létrehozásához a lekérdezésoptimalizáló rendezi az oszlopértékeket, kiszámítja az egyes oszlopértékeknek megfelelő értékek számát, majd az oszlopértékeket legfeljebb 200 összefüggő hisztogramlépésre összesíti. Minden lépés tartalmaz egy oszlopértéktartományt, majd egy felső kötött oszlopértéket. A tartomány magában foglalja a határértékek közötti összes lehetséges oszlopértéket, kivéve magukat a határértékeket. A rendezett oszlopértékek közül a legalacsonyabb az első hisztogramlépés felső határértéke.
Az alábbi ábrán egy hat lépésből áll a hisztogram. Az első felső határérték bal oldalán található terület az első lépés.
Minden hisztogram lépésnél:
A félkövér vonal a felső határértéket (range_high_key) és az előfordulások számát (equal_rows) jelöli.
A range_high_key egyszínű területe az oszlopértékek tartományát és az egyes oszlopértékek előfordulásának átlagos számát (average_range_rows) jelöli. Az első hisztogram lépés average_range_rows mindig 0.
A pontozott vonalak a tartomány különböző értékeinek teljes számának (distinct_range_rows) és a tartomány értékeinek teljes számának (range_rows) becsléséhez használt mintaértékeket jelölik. A lekérdezésoptimalizáló range_rows és distinct_range_rows használ a average_range_rows kiszámításához, és nem tárolja a mintául szolgáló értékeket.
A lekérdezésoptimalizáló a hisztogram lépéseit a statisztikai pontosságuknak megfelelően határozza meg. Maximális különbségi algoritmussal minimalizálja a hisztogram lépéseinek számát, miközben maximalizálja a határértékek közötti különbséget. A lépések maximális száma 200. A hisztogram lépéseinek száma kisebb lehet, mint a különböző értékek száma, még a 200-nál kevesebb határponttal rendelkező oszlopok esetében is. Egy 100 különböző értékkel rendelkező oszlop például 100-nál kevesebb határponttal rendelkező hisztogrammal rendelkezhet.
Permissions
A felhasználónak rendelkeznie kell a statisztikai oszlopokra vonatkozó engedélyekkel, vagy a felhasználó a tábla tulajdonosa, vagy a felhasználó tagja a sysadmin rögzített kiszolgálói szerepkörnek, a db_owner rögzített adatbázis-szerepkörnek vagy a db_ddladmin rögzített adatbázis-szerepkörnek.
Példák
A. Egyszerű példa
Az alábbi példa létrehoz és feltölt egy alapszintű táblát. Ezután statisztikákat hoz létre az Region_Name oszlopon.
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);
Az elsődleges kulcs az 1-es számot foglalja el stat_id , ezért hívja meg sys.dm_db_stats_histogramstat_id a 2-es számot a tábla statisztikai hisztogramjának Region visszaadásához.
SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID('Region'), 2);
B. Hasznos lekérdezés
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. Hasznos lekérdezés
Az alábbi példa egy oszlopon lévő predikátummal Regionrendelkező táblából Region_Name választ ki.
SELECT * FROM Region
WHERE Region_Name = 'Canada';
Az alábbi példa a fenti lekérdezés predikátumának megfelelő hisztogram lépés tábla- és oszlopstatisztikáját RegionRegion_Name vizsgálja.
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));