Megosztás a következőn keresztül:


sys.dm_db_stats_histogram (Transact-SQL)

Vonatkozik a következőkre: SQL Server 2016 (13.x) és későbbi verziók Azure SQL DatabaseAzure SQL Managed InstanceSQL 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.

Diagram a hisztogram mintául szolgáló oszlopértékekből való kiszámításának módjáról.

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