Táblastatisztikák létrehozása és frissítése dedikált SQL-készletben

Tip

Microsoft Fabric Data Warehouse egy nagyvállalati szintű relációs raktár egy Data Lake-alaprendszeren, jövőre kész architektúrával, beépített AI-vel és új funkciókkal. Ha még nem ismerkedik adattárházzal, kezdje a Fabric Data Warehouse. A meglévő dedikált SQL-készlet számítási feladatai frissíthetők Fabric az adatelemzés, a valós idejű elemzés és a jelentéskészítés új képességeinek eléréséhez.

Ez a cikk javaslatokat és példákat tartalmaz a dedikált SQL-készletben lévő táblák lekérdezésoptimalizálási statisztikáinak létrehozására és frissítésére.

Miért érdemes statisztikákat használni?

Minél több dedikált SQL-készlet tud az adatokról, annál gyorsabban hajthat végre lekérdezéseket. Miután betöltötte az adatokat a dedikált SQL-készletbe, az adatok statisztikáinak gyűjtése az egyik legfontosabb teendő a lekérdezések optimalizálásához.

A dedikált SQL-készlet lekérdezésoptimalizálója egy költségalapú optimalizáló. Összehasonlítja a különböző lekérdezési tervek költségeit, majd a legalacsonyabb költséggel választja ki a csomagot. A legtöbb esetben a leggyorsabban végrehajtó tervet választja ki.

Az optimalizáló például kiválaszt egy bizonyos tervet, ha becslést ad arról, hogy a lekérdezés szűrésének dátuma egy sort ad vissza. Ha az optimalizáló becslése szerint a kiválasztott dátum egymillió sort ad vissza, egy másik tervet választ.

Statisztika automatikus létrehozása

Ha az adatbázis-beállítás AUTO_CREATE_STATISTICS be van kapcsolva, a dedikált SQL-készlet elemzi a hiányzó statisztikák bejövő felhasználói lekérdezéseit.

Ha a statisztikák hiányoznak, a lekérdezésoptimalizáló statisztikákat hoz létre a lekérdezési predikátum egyes oszlopaiban vagy összekapcsolási feltételében, hogy javítsa a lekérdezésterv számosságbecsléseit.

Feljegyzés

A statisztikák automatikus létrehozása jelenleg alapértelmezés szerint be van kapcsolva.

A következő T-SQL-parancs futtatásával ellenőrizheti, hogy a dedikált SQL-készlet konfigurálva van-e AUTO_CREATE_STATISTICS :

SELECT name, is_auto_create_stats_on
FROM sys.databases

Ha a dedikált SQL-készlet nincs AUTO_CREATE_STATISTICS konfigurálva, javasoljuk, hogy az alábbi parancs futtatásával engedélyezze ezt a tulajdonságot. Cserélje le <your-datawarehouse-name> a dedikált SQL-készlet nevére.

ALTER DATABASE <your-datawarehouse-name>
SET AUTO_CREATE_STATISTICS ON

Ezek az utasítások a statisztikák automatikus létrehozását váltják ki:

  • SELECT
  • INSERT... SELECT
  • CREATE TABLE AS SELECT (CTAS)
  • UPDATE
  • DELETE
  • EXPLAIN amikor illesztés vagy predikátum jelenlétét észlelik

Feljegyzés

A statisztikák automatikus létrehozása nem történik meg ideiglenes vagy külső táblákon.

A statisztikák automatikus létrehozása szinkron módon történik, így kismértékben csökkenhet a lekérdezési teljesítmény, ha az oszlopokból hiányoznak statisztikák. Az egyetlen oszlop statisztikáinak létrehozásához szükséges idő a tábla méretétől függ.

A mérhető teljesítménycsökkenés elkerülése érdekében a rendszer profilkészítése előtt győződjön meg arról, hogy a statisztikák először a teljesítményteszt számítási feladatainak végrehajtásával lettek létrehozva.

Feljegyzés

A statisztikák létrehozását a rendszer egy másik felhasználói környezetben naplózza sys.dm_pdw_exec_requests .

Az automatikus statisztikák létrehozásakor a következő formában jelennek meg: _WA_Sys_<8 digit column id in Hex>_<8 digit table id in Hex>. A DBCC SHOW_STATISTICS parancs futtatásával megtekintheti a már létrehozott statisztikákat:

DBCC SHOW_STATISTICS (<table_name>, <target>)

A table_name megjelenítendő statisztikákat tartalmazó tábla neve. Ez a tábla nem lehet külső tábla. A cél annak a célindexnek, statisztikai adatnak vagy oszlopnak a neve, amelynek statisztikai adatait meg szeretné jeleníteni.

Statisztika frissítése

Az egyik ajánlott eljárás a dátumoszlopok statisztikáinak napi frissítése új dátumok hozzáadásakor. Minden alkalommal, amikor új sorokat tölt be a dedikált SQL-készletbe, új betöltési dátumokat vagy tranzakciódátumokat ad hozzá. Ezek a kiegészítések megváltoztatják az adateloszlást, és elavultá teszik a statisztikákat.

Előfordulhat, hogy egy ügyféltábla ország/régió oszlopának statisztikáit nem kell frissíteni, mivel az értékek eloszlása általában nem változik. Feltéve, hogy az eloszlás állandó az ügyfelek között, az új sorok hozzáadása a táblázat változatához nem változtatja meg az adateloszlást.

Ha azonban a dedikált SQL-készlet csak egy országot/régiót tartalmaz, és egy új országból/régióból származó adatokat hoz létre, és több országból/régióból származó adatokat tárol, akkor frissítenie kell az ország/régió oszlop statisztikáit.

A statisztikák frissítésére vonatkozó javaslatok a következők:

Statisztikai tulajdonság Ajánlás
A statisztikafrissítések gyakorisága Konzervatív: Naponta
az adatok betöltése vagy átalakítása után
Mintavételezés Kevesebb mint 1 milliárd sor, használjon alapértelmezett mintavételezést (20 százalék).
Több mint 1 milliárd sor esetén két százalékos mintavételezést használjon.

Az egyik első kérdés, amelyet fel kell tenni egy lekérdezés hibaelhárítása során: "Naprakészek-e a statisztikák?"

Ez a kérdés nem válaszolható meg az adatok életkorával. Egy naprakész statisztikai objektum régi lehet, ha nem történt lényeges változás a mögöttes adatokban. Ha a sorok száma jelentősen megváltozott, vagy lényeges változás történt egy oszlop értékeinek eloszlásában, akkor ideje frissíteni a statisztikákat.

Nincs dinamikus felügyeleti nézet annak megállapításához, hogy a tábla adatai megváltoztak-e a statisztikák legutóbbi frissítése óta. Az alábbi két lekérdezés segíthet megállapítani, hogy a statisztikák elavultak-e.

  • 1. lekérdezés: Keresse meg a statisztikából () és a tényleges sorszámból (stats_row_countactual_row_count) származó sorok száma közötti különbséget.

    select 
    objIdsWithStats.[object_id], 
    actualRowCounts.[schema], 
    actualRowCounts.logical_table_name, 
    statsRowCounts.stats_row_count, 
    actualRowCounts.actual_row_count,
    row_count_difference = CASE
        WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN actualRowCounts.actual_row_count - statsRowCounts.stats_row_count
        ELSE statsRowCounts.stats_row_count - actualRowCounts.actual_row_count
    END,
    percent_deviation_from_actual = CASE
        WHEN actualRowCounts.actual_row_count = 0 THEN statsRowCounts.stats_row_count
        WHEN statsRowCounts.stats_row_count = 0 THEN actualRowCounts.actual_row_count
        WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (actualRowCounts.actual_row_count - statsRowCounts.stats_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100)
        ELSE CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (statsRowCounts.stats_row_count - actualRowCounts.actual_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100)
    END
    from
    (
        select distinct object_id from sys.stats where stats_id > 1
    ) objIdsWithStats
    left join
    (
        select object_id, sum(rows) as stats_row_count from sys.partitions group by object_id
    ) statsRowCounts
    on objIdsWithStats.object_id = statsRowCounts.object_id 
    left join
    (
        SELECT sm.name [schema] ,
            tb.name logical_table_name ,
            tb.object_id object_id ,
            SUM(rg.row_count) actual_row_count
        FROM sys.schemas sm
             INNER JOIN sys.tables tb ON sm.schema_id = tb.schema_id
             INNER JOIN sys.pdw_table_mappings mp ON tb.object_id = mp.object_id
             INNER JOIN sys.pdw_nodes_tables nt ON nt.name = mp.physical_name
             INNER JOIN sys.dm_pdw_nodes_db_partition_stats rg     ON rg.object_id = nt.object_id
                AND rg.pdw_node_id = nt.pdw_node_id
                AND rg.distribution_id = nt.distribution_id
        WHERE rg.index_id = 1
        GROUP BY sm.name, tb.name, tb.object_id
    ) actualRowCounts
    on objIdsWithStats.object_id = actualRowCounts.object_id
    
    
  • 2. lekérdezés: A statisztikák korának megkereséséhez ellenőrizze, hogy mikor frissültek utoljára a statisztikák az egyes táblákon.

    Feljegyzés

    Ha egy oszlop értékeinek eloszlása lényegesen megváltozik, a legutóbbi frissítés időpontjától függetlenül frissítenie kell a statisztikákat.

    SELECT
        sm.[name] AS [schema_name],
        tb.[name] AS [table_name],
        co.[name] AS [stats_column_name],
        st.[name] AS [stats_name],
        STATS_DATE(st.[object_id],st.[stats_id]) AS [stats_last_updated_date]
    FROM
        sys.objects ob
        JOIN sys.stats st
            ON  ob.[object_id] = st.[object_id]
        JOIN sys.stats_columns sc
            ON  st.[stats_id] = sc.[stats_id]
            AND st.[object_id] = sc.[object_id]
        JOIN sys.columns co
            ON  sc.[column_id] = co.[column_id]
            AND sc.[object_id] = co.[object_id]
        JOIN sys.types  ty
            ON  co.[user_type_id] = ty.[user_type_id]
        JOIN sys.tables tb
            ON  co.[object_id] = tb.[object_id]
        JOIN sys.schemas sm
            ON  tb.[schema_id] = sm.[schema_id]
    WHERE
        st.[user_created] = 1;
    

A dedikált SQL-készlet dátumoszlopaihoz például általában gyakori statisztikai frissítésekre van szükség. Minden alkalommal, amikor új sorokat tölt be a dedikált SQL-készletbe, új betöltési dátumokat vagy tranzakciódátumokat ad hozzá. Ezek a kiegészítések megváltoztatják az adateloszlást, és elavultá teszik a statisztikákat.

Ezzel szemben előfordulhat, hogy egy ügyféltábla nemi oszlopának statisztikáit soha nem kell frissíteni. Feltéve, hogy az eloszlás állandó az ügyfelek között, az új sorok hozzáadása a táblázat változatához nem változtatja meg az adateloszlást.

Ha a dedikált SQL-készlet csak egy nemet tartalmaz, és egy új követelmény több nemet eredményez, akkor frissítenie kell a nemek oszlopának statisztikáit.

További információkért tekintse meg a statisztika általános útmutatóját.

Statisztikakezelés implementálása

Gyakran érdemes kiterjeszteni az adatbetöltési folyamatot annak érdekében, hogy a terhelés végén a statisztikák frissüljenek, így elkerülheti vagy minimalizálhatja az egyidejű lekérdezések közötti blokkolást vagy erőforrás-versengést.

Az adatbetöltés az, amikor a táblák leggyakrabban módosítják a méretüket vagy az értékek eloszlását. Az adatbetöltés logikus hely bizonyos felügyeleti folyamatok implementálásához.

A statisztikák frissítéséhez az alábbi irányelveket biztosítjuk:

  • Győződjön meg arról, hogy minden betöltött tábla legalább egy frissített statisztikai objektummal rendelkezik. Ez frissíti a táblázat méretét (sorszám és oldalszám) a statisztikai frissítés részeként.
  • A JOIN, GROUP BY, ORDER BY és DISTINCT záradékokban részt vevő oszlopokra összpontosítson.
  • Érdemes lehet gyakrabban frissíteni a növekvő kulcsoszlopokat , például a tranzakciódátumokat, mert ezek az értékek nem szerepelnek a statisztikai hisztogramban.
  • Fontolja meg a statikus terjesztési oszlopok ritkábban történő frissítését.
  • Ne feledje, hogy minden statisztikai objektum egymás után frissül. Az egyszerű implementálás UPDATE STATISTICS <TABLE_NAME> nem mindig ideális, különösen a sok statisztikai objektumot tartalmazó széles táblák esetében.

További információ: Számosság becslése.

Példák: Statisztikák létrehozása

Ezek a példák bemutatják, hogyan használhat különböző beállításokat a statisztikák létrehozásához. Az egyes oszlopokhoz használt beállítások az adatok jellemzőitől és az oszlop lekérdezésekben való használatától függnek.

Egyoszlopos statisztikák létrehozása alapértelmezett beállításokkal

Ha statisztikákat szeretne létrehozni egy oszlopon, adja meg a statisztikai objektum nevét és az oszlop nevét.

Ez a szintaxis az összes alapértelmezett beállítást használja. Alapértelmezés szerint a rendszer a tábla 20 százalékát mintavételezi a statisztikák létrehozásakor.

CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]);

Példa:

CREATE STATISTICS col1_stats ON dbo.table1 (col1);

Egyoszlopos statisztikák létrehozása minden sor vizsgálatával

A legtöbb helyzetben elegendő az alapértelmezett 20 százalékos mintavételezési arány. Azonban módosíthatja a mintavételezési sebességet.

A teljes táblázat mintájához használja a következő szintaxist:

CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]) WITH FULLSCAN;

Példa:

CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH FULLSCAN;

Egyoszlopos statisztikák létrehozása a minta méretének megadásával

Másik lehetőségként megadhatja a minta méretét százalékként:

CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH SAMPLE = 50 PERCENT;

Egyoszlopos statisztikák létrehozása csak néhány sorra

A táblázat sorainak egy részére vonatkozó statisztikákat is létrehozhat. Ezt szűrt statisztikáknak nevezzük.

Szűrt statisztikákat például akkor használhat, ha egy nagy particionált tábla adott partícióját szeretné lekérdezni. Ha csak a partícióértékekre hoz létre statisztikákat, a statisztikák pontossága javul, ami javítja a lekérdezési teljesítményt.

Ez a példa egy értéktartomány statisztikáit hozza létre. Az értékek egyszerűen definiálhatók úgy, hogy megfeleljenek a partícióban lévő értékek tartományának.

CREATE STATISTICS stats_col1 ON table1(col1) WHERE col1 > '2000101' AND col1 < '20001231';

Feljegyzés

Ahhoz, hogy a lekérdezésoptimalizáló az elosztott lekérdezési terv kiválasztásakor megfontolja a szűrt statisztikák használatát, a lekérdezésnek el kell férnie a statisztikai objektum definíciója között. Az előző példában a lekérdezés WHERE záradékának col1 értéket kell megadnia 2000101 és 20001231 között.

Egyoszlopos statisztikák létrehozása az összes beállítással

A beállításokat kombinálhatja is. Az alábbi példa egy szűrt statisztikai objektumot hoz létre egyéni mintamérettel:

CREATE STATISTICS stats_col1 ON table1 (col1) WHERE col1 > '2000101' AND col1 < '20001231' WITH SAMPLE = 50 PERCENT;

A teljes hivatkozásért tekintse meg a CREATE STATISTICS (STATISZTIKÁK LÉTREHOZÁSA) című témakört.

Többoszlopos statisztikák létrehozása

Többoszlopos statisztikai objektum létrehozásához használja az előző példákat, de adjon meg további oszlopokat.

Feljegyzés

A lekérdezés eredményében szereplő sorok számának becslésére használt hisztogram csak a statisztikai objektumdefinícióban szereplő első oszlophoz érhető el.

Ebben a példában a hisztogram megjelenik product_category. A keresztoszlopok statisztikái a következőkre product_categoryproduct_sub_categoryvannak kiszámítva:

CREATE STATISTICS stats_2cols ON table1 (product_category, product_sub_category) WHERE product_category > '2000101' AND product_category < '20001231' WITH SAMPLE = 50 PERCENT;

Mivel korreláció van a többoszlopos product_categorystatisztikai objektumok közöttproduct_sub_category, akkor hasznos lehet, ha ezek az oszlopok egyszerre érhetők el.

Statisztika létrehozása egy tábla összes oszlopán

A statisztikák létrehozásának egyik módja, ha parancsokat ad CREATE STATISTICS ki a tábla létrehozása után:

CREATE TABLE dbo.table1
(
   col1 int
,  col2 int
,  col3 int
)
WITH
  (
    CLUSTERED COLUMNSTORE INDEX
  )
;

CREATE STATISTICS stats_col1 on dbo.table1 (col1);
CREATE STATISTICS stats_col2 on dbo.table2 (col2);
CREATE STATISTICS stats_col3 on dbo.table3 (col3);

Tárolt eljárás használata egy SQL-készlet összes oszlopának statisztikáinak létrehozásához

A dedikált SQL-készlet nem rendelkezik az SQL Server sp_create_stats rendszer tárolt eljárásának megfelelőjével. Ez a tárolt eljárás egyetlen oszlopstatisztikai objektumot hoz létre egy olyan SQL-készlet minden oszlopán, amely még nem rendelkezik statisztikával.

Az alábbi példa bemutatja, hogyan kezdheti meg az SQL-készlet kialakítását. Nyugodtan alkalmazkodjon az igényeihez.

CREATE PROCEDURE    [dbo].[prc_sqldw_create_stats]
(   @create_type    tinyint -- 1 default 2 Fullscan 3 Sample
,   @sample_pct     tinyint
)
AS

IF @create_type IS NULL
BEGIN
    SET @create_type = 1;
END;

IF @create_type NOT IN (1,2,3)
BEGIN
    THROW 151000,'Invalid value for @stats_type parameter. Valid range 1 (default), 2 (fullscan) or 3 (sample).',1;
END;

IF @sample_pct IS NULL
BEGIN;
    SET @sample_pct = 20;
END;

IF OBJECT_ID('tempdb..#stats_ddl') IS NOT NULL
BEGIN;
    DROP TABLE #stats_ddl;
END;

CREATE TABLE #stats_ddl
WITH    (   DISTRIBUTION    = HASH([seq_nmbr])
        ,   LOCATION        = USER_DB
        )
AS
WITH T
AS
(
SELECT      t.[name]                        AS [table_name]
,           s.[name]                        AS [table_schema_name]
,           c.[name]                        AS [column_name]
,           c.[column_id]                   AS [column_id]
,           t.[object_id]                   AS [object_id]
,           ROW_NUMBER()
            OVER(ORDER BY (SELECT NULL))    AS [seq_nmbr]
FROM        sys.[tables] t
JOIN        sys.[schemas] s         ON  t.[schema_id]       = s.[schema_id]
JOIN        sys.[columns] c         ON  t.[object_id]       = c.[object_id]
LEFT JOIN   sys.[stats_columns] l   ON  l.[object_id]       = c.[object_id]
                                    AND l.[column_id]       = c.[column_id]
                                    AND l.[stats_column_id] = 1
LEFT JOIN    sys.[external_tables] e    ON    e.[object_id]        = t.[object_id]
WHERE       l.[object_id] IS NULL
AND            e.[object_id] IS NULL -- not an external table
)
SELECT  [table_schema_name]
,       [table_name]
,       [column_name]
,       [column_id]
,       [object_id]
,       [seq_nmbr]
,       CASE @create_type
        WHEN 1
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+')' AS VARCHAR(8000))
        WHEN 2
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH FULLSCAN' AS VARCHAR(8000))
        WHEN 3
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH SAMPLE '+CONVERT(varchar(4),@sample_pct)+' PERCENT' AS VARCHAR(8000))
        END AS create_stat_ddl
FROM T
;

DECLARE @i INT              = 1
,       @t INT              = (SELECT COUNT(*) FROM #stats_ddl)
,       @s NVARCHAR(4000)   = N''
;

WHILE @i <= @t
BEGIN
    SET @s=(SELECT create_stat_ddl FROM #stats_ddl WHERE seq_nmbr = @i);

    PRINT @s
    EXEC sp_executesql @s
    SET @i+=1;
END

DROP TABLE #stats_ddl;

Ha a tábla összes oszlopára vonatkozó statisztikákat az alapértelmezett értékekkel szeretné létrehozni, hajtsa végre a tárolt eljárást.

EXEC [dbo].[prc_sqldw_create_stats] 1, NULL;

Ha egy teljes adathalmaz használatával szeretne statisztikákat létrehozni a táblázat összes oszlopán, hívja meg ezt az eljárást.

EXEC [dbo].[prc_sqldw_create_stats] 2, NULL;

Ha a tábla összes oszlopában szeretne mintául szolgáló statisztikát létrehozni, adja meg a 3 értéket és a minta százalékos értékét. Ez az eljárás 20 százalékos mintaarányt használ.

EXEC [dbo].[prc_sqldw_create_stats] 3, 20;

Példák: Frissítési statisztikák

A statisztikák frissítéséhez az alábbiakat végezheti el:

  • Frissítsen egy statisztikai objektumot. Adja meg a frissíteni kívánt statisztikai objektum nevét.
  • Frissítse a tábla összes statisztikai objektumát. Adja meg a tábla nevét egy adott statisztikai objektum helyett.

Egy adott statisztikai objektum frissítése

Az alábbi szintaxissal frissíthet egy adott statisztikai objektumot:

UPDATE STATISTICS [schema_name].[table_name]([stat_name]);

Példa:

UPDATE STATISTICS [dbo].[table1] ([stats_col1]);

Bizonyos statisztikai objektumok frissítésével minimalizálhatja a statisztikák kezeléséhez szükséges időt és erőforrásokat. Ehhez némi gondolkodásra van szükség ahhoz, hogy a legjobb statisztikai objektumokat kell kiválasztani a frissítéshez.

Tábla összes statisztikáinak frissítése

A tábla összes statisztikai objektumának frissítésére szolgáló egyszerű módszer a következő:

UPDATE STATISTICS [schema_name].[table_name];

Példa:

UPDATE STATISTICS dbo.table1;

Az UPDATE STATISTICS utasítás könnyen használható. Ne feledje, hogy frissíti a tábla összes statisztikáit, ezért a szükségesnél több munkát végezhet. Ha a teljesítmény nem probléma, ez a legegyszerűbb és legteljesebb módja annak, hogy a statisztikák naprakészek legyenek.

Feljegyzés

Amikor frissíti egy tábla összes statisztikáját, a dedikált SQL-készlet beolvasást végez, hogy mintát vegyen a tábláról az egyes statisztikai objektumokhoz. Ha a táblázat nagy, és sok oszlopot és sok statisztikát tartalmaz, akkor hatékonyabb lehet az egyes statisztikák igény szerinti frissítése.

Az eljárás végrehajtásához UPDATE STATISTICS tekintse meg az ideiglenes táblákat. A megvalósítási módszer kissé eltér az előző CREATE STATISTICS eljárástól, de az eredmény ugyanaz.

A teljes szintaxisért tekintse meg a Statisztika frissítése című témakört.

Statisztikai metaadatok

Számos rendszernézet és függvény használható a statisztikákkal kapcsolatos információk megtalálásához. Például láthatja, hogy egy statisztikai objektum elavult-e. Ehhez használja a stats-date függvényt a statisztikák legutóbbi létrehozásának vagy frissítésének időpontjához.

Katalógusnézetek statisztikákhoz

Ezek a rendszernézetek a statisztikákról nyújtanak információt:

Katalógusnézet Leírás
sys.columns Minden oszlophoz egy sor
sys.objects Egy sor az adatbázis minden objektumához
sys.schemas Az adatbázis minden sémájának egy sora
sys.stats Egy sor minden statisztikai objektumhoz
sys.stats_columns Egy sor a statisztikai objektum minden oszlopához; a sys.columnsra mutató hivatkozások
sys.tables Minden táblához tartozik egy sor (beleértve a külső táblákat is)
sys.table_types Minden adattípushoz egy sor

Rendszerfüggvények statisztikákhoz

Ezek a rendszerfüggvények hasznosak a statisztikák kezeléséhez:

Rendszerfüggvény Leírás
STATS_DATE A statisztikai objektum utolsó frissítésének dátuma
DBCC SHOW_STATISTICS Összegző szint és részletes információ az értékek statisztikai objektum által értelmezett eloszlásáról

Statisztikai oszlopok és függvények egyesítése egyetlen nézetben

Ez a nézet összehozza a függvény statisztikáihoz és eredményeihez STATS_DATE() kapcsolódó oszlopokat.

CREATE VIEW dbo.vstats_columns
AS
SELECT
        sm.[name]                           AS [schema_name]
,       tb.[name]                           AS [table_name]
,       st.[name]                           AS [stats_name]
,       st.[filter_definition]              AS [stats_filter_definition]
,       st.[has_filter]                     AS [stats_is_filtered]
,       STATS_DATE(st.[object_id],st.[stats_id])
                                            AS [stats_last_updated_date]
,       co.[name]                           AS [stats_column_name]
,       ty.[name]                           AS [column_type]
,       co.[max_length]                     AS [column_max_length]
,       co.[precision]                      AS [column_precision]
,       co.[scale]                          AS [column_scale]
,       co.[is_nullable]                    AS [column_is_nullable]
,       co.[collation_name]                 AS [column_collation_name]
,       QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
                                            AS two_part_name
,       QUOTENAME(DB_NAME())+'.'+QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
                                            AS three_part_name
FROM    sys.objects                         AS ob
JOIN    sys.stats           AS st ON    ob.[object_id]      = st.[object_id]
JOIN    sys.stats_columns   AS sc ON    st.[stats_id]       = sc.[stats_id]
                            AND         st.[object_id]      = sc.[object_id]
JOIN    sys.columns         AS co ON    sc.[column_id]      = co.[column_id]
                            AND         sc.[object_id]      = co.[object_id]
JOIN    sys.types           AS ty ON    co.[user_type_id]   = ty.[user_type_id]
JOIN    sys.tables          AS tb ON  co.[object_id]        = tb.[object_id]
JOIN    sys.schemas         AS sm ON  tb.[schema_id]        = sm.[schema_id]
WHERE   1=1
AND     st.[user_created] = 1
;

DBCC-SHOW_STATISTICS() példák

DBCC SHOW_STATISTICS() a statisztikai objektumban tárolt adatokat jeleníti meg. Ezek az adatok három részből állnak:

  • Fejléc
  • Sűrűségvektor
  • Hisztogram

A statisztikák fejlécmetaadatai. A hisztogram a statisztikai objektum első kulcsoszlopában jeleníti meg az értékek eloszlását. A sűrűségvektor oszlopközi korrelációt mér.

Feljegyzés

A dedikált SQL-készlet számosságbecsléseket számít ki a statisztikai objektum bármely adatával.

Fejléc, sűrűség és hisztogram megjelenítése

Ez az egyszerű példa egy statisztikai objektum mindhárom részét mutatja be:

DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>)

Példa:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1);

A DBCC SHOW_STATISTICS() egy vagy több részének megjelenítése

Ha csak bizonyos részek megtekintésére kíváncsi, használja a WITH záradékot, és adja meg, hogy mely részek jelenjenek meg:

DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>) WITH stat_header, histogram, density_vector

Példa:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1) WITH histogram, density_vector

DBCC SHOW_STATISTICS() eltérései

DBCC SHOW_STATISTICS() az SQL Serverhez képest szigorúbban implementálva van a dedikált SQL-készletben:

  • A nem dokumentált funkciók nem támogatottak.
  • Nem használható Stats_stream.
  • A statisztikai adatok adott részhalmazainak eredményei nem illeszthetők össze. Például: STAT_HEADER JOIN DENSITY_VECTOR.
  • NO_INFOMSGS nem állítható be az üzenetek letiltására.
  • A statisztikai nevek körüli szögletes zárójelek nem használhatók.
  • Nem használhatók oszlopnevek statisztikai objektumok azonosítására.
  • A 2767-s egyéni hiba nem támogatott.

Dedikált Azure Synapse Analytics SQL-készlet számítási feladatainak monitorozása DMV-k használatával