Delen via


Tabelstatistieken maken en bijwerken in toegewezen SQL-pool

Dit artikel bevat aanbevelingen en voorbeelden voor het maken en bijwerken van queryoptimalisatiestatistieken voor tabellen in een toegewezen SQL-pool.

Waarom statistieken gebruiken

Hoe meer toegewezen SQL-pool over uw gegevens weet, hoe sneller er query's op kunnen worden uitgevoerd. Nadat u gegevens in een toegewezen SQL-pool hebt geladen, is het verzamelen van statistieken over uw gegevens een van de belangrijkste dingen die u kunt doen om uw query's te optimaliseren.

De queryoptimalisatie voor toegewezen SQL-pools is een optimalisatie op basis van kosten. Het vergelijkt de kosten van verschillende queryplannen en kiest vervolgens het abonnement met de laagste kosten. In de meeste gevallen wordt het plan gekozen dat het snelst wordt uitgevoerd.

De optimizer selecteert bijvoorbeeld een bepaald plan als wordt geschat dat de datum waarop uw query wordt gefilterd één rij retourneert. Als door de optimalisatiefunctie wordt geschat dat de geselecteerde datum een miljoen rijen retourneert, wordt er een ander plan gekozen.

Automatisch maken van statistiek

Wanneer de databaseoptie AUTO_CREATE_STATISTICS is ingeschakeld, analyseert de toegewezen SQL-pool binnenkomende gebruikersquery's voor ontbrekende statistieken.

Als er statistieken ontbreken, maakt de queryoptimalisatie statistieken over afzonderlijke kolommen in het querypredicaat of joinvoorwaarde om kardinaliteitschattingen voor het queryplan te verbeteren.

Notitie

Het automatisch maken van statistieken is momenteel standaard ingeschakeld.

U kunt controleren of uw toegewezen SQL-pool is AUTO_CREATE_STATISTICS geconfigureerd door de volgende T-SQL-opdracht uit te voeren:

SELECT name, is_auto_create_stats_on
FROM sys.databases

Als uw toegewezen SQL-pool niet is AUTO_CREATE_STATISTICS geconfigureerd, raden we u aan deze eigenschap in te schakelen door de volgende opdracht uit te voeren. Vervang door <your-datawarehouse-name> de naam van uw toegewezen SQL-pool.

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

Deze instructies activeren het automatisch maken van statistieken:

  • SELECT
  • INSERT... SELECT
  • CREATE TABLE AS SELECT (CTAS)
  • UPDATE
  • DELETE
  • EXPLAIN bij het bevatten van een join of de aanwezigheid van een predicaat wordt gedetecteerd

Notitie

Het automatisch maken van statistieken wordt niet uitgevoerd op tijdelijke of externe tabellen.

Het automatisch maken van statistieken wordt synchroon uitgevoerd, zodat er mogelijk iets slechtere queryprestaties optreden als er statistieken ontbreken in uw kolommen. De tijd die nodig is om statistieken voor één kolom te maken, is afhankelijk van de grootte van de tabel.

Om meetbare prestatievermindering te voorkomen, moet u ervoor zorgen dat er eerst statistieken zijn gemaakt door de benchmarkworkload uit te voeren voordat u het systeem profileert.

Notitie

Het maken van statistieken wordt vastgelegd in sys.dm_pdw_exec_requests onder een andere gebruikerscontext.

Wanneer automatische statistieken worden gemaakt, hebben ze de volgende vorm: _WA_Sys_<8 digit column id in Hex>_<8 digit table id in Hex>. U kunt statistieken bekijken die al zijn gemaakt door de DBCC-opdracht SHOW_STATISTICS uit te voeren:

DBCC SHOW_STATISTICS (<table_name>, <target>)

Dit table_name is de naam van de tabel die de statistieken bevat die moeten worden weergegeven. Deze tabel kan geen externe tabel zijn. Het doel is de naam van de doelindex, statistieken of kolom waarvoor statistiekengegevens moeten worden weergegeven.

Statistieken bijwerken

Een best practice is om statistieken bij te werken op datumkolommen elke dag wanneer er nieuwe datums worden toegevoegd. Telkens wanneer nieuwe rijen in de toegewezen SQL-pool worden geladen, worden nieuwe laaddatums of transactiedatums toegevoegd. Deze toevoegingen wijzigen de gegevensdistributie en maken de statistieken verouderd.

Statistieken voor een kolom land/regio in een klanttabel hoeven mogelijk nooit te worden bijgewerkt omdat de verdeling van waarden over het algemeen niet verandert. Ervan uitgaande dat de distributie constant is tussen klanten, wordt de gegevensdistributie niet gewijzigd door nieuwe rijen toe te voegen aan de tabelvariatie.

Als uw toegewezen SQL-pool echter slechts één land/regio bevat en u gegevens uit een nieuw land/een nieuwe regio opgeeft, wat resulteert in gegevens uit meerdere landen/regio's die worden opgeslagen, moet u statistieken bijwerken in de kolom land/regio.

Hieronder volgen aanbevelingen voor het bijwerken van statistieken:

Kenmerk Statistieken Aanbeveling
Frequentie van updates voor statistieken Conservatief: Dagelijks na
het laden of transformeren van uw gegevens
Steekproeven Minder dan 1 miljard rijen gebruiken standaardsampling (20 procent).
Gebruik met meer dan 1 miljard rijen steekproeven van twee procent.

Een van de eerste vragen die u moet stellen wanneer u problemen met een query wilt oplossen, is 'Zijn de statistieken up-to-date?'

Deze vraag kan niet worden beantwoord door de leeftijd van de gegevens. Een up-to-date statistiekenobject kan oud zijn als er geen materiële wijziging is aangebracht in de onderliggende gegevens. Wanneer het aantal rijen aanzienlijk is gewijzigd, of er is een materiële wijziging in de verdeling van waarden voor een kolom, is het tijd om statistieken bij te werken.

Er is geen dynamische beheerweergave om te bepalen of gegevens in de tabel zijn gewijzigd sinds de laatste keer dat statistieken zijn bijgewerkt. Met de volgende twee query's kunt u bepalen of uw statistieken verouderd zijn.

  • Query 1: Zoek het verschil tussen het aantal rijen uit de statistieken (stats_row_count) en het werkelijke aantal rijen (actual_row_count).

    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
    
    
  • Query 2: Zoek de leeftijd van uw statistieken door de laatste keer dat uw statistieken zijn bijgewerkt in elke tabel te controleren.

    Notitie

    Als er een materiële wijziging is in de verdeling van waarden voor een kolom, moet u statistieken bijwerken, ongeacht de laatste keer dat ze zijn bijgewerkt.

    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;
    

Datumkolommen in een toegewezen SQL-pool, bijvoorbeeld, hebben meestal frequente statistiekenupdates nodig. Telkens wanneer nieuwe rijen in de toegewezen SQL-pool worden geladen, worden nieuwe laaddatums of transactiedatums toegevoegd. Deze toevoegingen wijzigen de gegevensdistributie en maken de statistieken verouderd.

Omgekeerd hoeven statistieken over een geslachtskolom in een klanttabel mogelijk nooit te worden bijgewerkt. Ervan uitgaande dat de distributie constant is tussen klanten, wordt de gegevensdistributie niet gewijzigd door nieuwe rijen toe te voegen aan de tabelvariatie.

Als uw toegewezen SQL-pool slechts één geslacht bevat en een nieuwe vereiste resulteert in meerdere geslachten, moet u statistieken voor de genderkolom bijwerken.

Zie algemene richtlijnen voor statistieken voor meer informatie.

Statistiekenbeheer implementeren

Het is vaak een goed idee om uw proces voor het laden van gegevens uit te breiden om ervoor te zorgen dat statistieken aan het einde van de belasting worden bijgewerkt om blokkeren of resourceconflicten tussen gelijktijdige query's te voorkomen of te minimaliseren.

De gegevensbelasting is wanneer tabellen de grootte of de verdeling van waarden het vaakst wijzigen. Het laden van gegevens is een logische plek om bepaalde beheerprocessen te implementeren.

De volgende richtlijnen worden gegeven voor het bijwerken van uw statistieken:

  • Zorg ervoor dat voor elke geladen tabel ten minste één statistiekenobject is bijgewerkt. Hiermee wordt de tabelgrootte (aantal rijen en het aantal pagina's) bijgewerkt als onderdeel van de statistiekenupdate.
  • Focus op kolommen die deelnemen aan JOIN, GROUP BY-, ORDER BY en DISTINCT-componenten.
  • Overweeg om oplopende sleutelkolommen zoals transactiedatums vaker bij te werken, omdat deze waarden niet zijn opgenomen in het histogram voor statistieken.
  • Overweeg om statische distributiekolommen minder vaak bij te werken.
  • Onthoud dat elk statistiekobject op volgorde wordt bijgewerkt. Eenvoudig implementeren UPDATE STATISTICS <TABLE_NAME> is niet altijd ideaal, met name voor brede tabellen met veel statistiekenobjecten.

Zie Kardinaliteitsraming voor meer informatie.

Voorbeelden: Statistieken maken

In deze voorbeelden ziet u hoe u verschillende opties kunt gebruiken voor het maken van statistieken. De opties die u voor elke kolom gebruikt, zijn afhankelijk van de kenmerken van uw gegevens en hoe de kolom wordt gebruikt in query's.

Statistieken met één kolom maken met standaardopties

Als u statistieken voor een kolom wilt maken, geeft u een naam op voor het statistiekenobject en de naam van de kolom.

Deze syntaxis maakt gebruik van alle standaardopties. Standaard wordt 20 procent van de tabel genomen bij het maken van statistieken.

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

Voorbeeld:

CREATE STATISTICS col1_stats ON dbo.table1 (col1);

Statistieken met één kolom maken door elke rij te bekijken

De standaardsampling van 20 procent is voldoende voor de meeste situaties. U kunt de steekproeffrequentie echter aanpassen.

Als u een voorbeeld van de volledige tabel wilt gebruiken, gebruikt u deze syntaxis:

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

Voorbeeld:

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

Statistieken met één kolom maken door de steekproefgrootte op te geven

U kunt ook de grootte van de steekproef opgeven als een percentage:

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

Statistieken met één kolom maken voor slechts enkele rijen

U kunt ook statistieken maken voor een deel van de rijen in uw tabel. Dit wordt een gefilterde statistiek genoemd.

U kunt bijvoorbeeld gefilterde statistieken gebruiken wanneer u een query wilt uitvoeren op een specifieke partitie van een grote gepartitioneerde tabel. Door alleen statistieken te maken op de partitiewaarden, wordt de nauwkeurigheid van de statistieken verbeterd, waardoor de queryprestaties worden verbeterd.

In dit voorbeeld worden statistieken gemaakt voor een bereik van waarden. De waarden kunnen eenvoudig worden gedefinieerd om het bereik van waarden in een partitie te vinden.

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

Notitie

Voor het optimaliseren van query's om gefilterde statistieken te kunnen gebruiken wanneer het gedistribueerde queryplan wordt gekozen, moet de query binnen de definitie van het statistiekenobject passen. In het vorige voorbeeld moet de WHERE-component van de query col1-waarden opgeven tussen 2000101 en 20001231.

Statistieken met één kolom maken met alle opties

U kunt de opties ook combineren. In het volgende voorbeeld wordt een gefilterd statistiekenobject gemaakt met een aangepaste steekproefgrootte:

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

Zie CREATE STATISTICS voor de volledige referentie.

Statistieken met meerdere kolommen maken

Als u een statistiekenobject met meerdere kolommen wilt maken, gebruikt u de vorige voorbeelden, maar geeft u meer kolommen op.

Notitie

Het histogram, dat wordt gebruikt om het aantal rijen in het queryresultaat te schatten, is alleen beschikbaar voor de eerste kolom die wordt vermeld in de definitie van het statistiekenobject.

In dit voorbeeld is het histogram ingeschakeld product_category. Statistieken voor meerdere kolommen worden berekend op product_category en product_sub_category:

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

Omdat er een correlatie is tussen product_category en product_sub_category, kan een statistische object met meerdere kolommen handig zijn als deze kolommen tegelijkertijd worden geopend.

Statistieken maken voor alle kolommen in een tabel

Een manier om statistieken te maken, is door opdrachten uit te voeren CREATE STATISTICS nadat u de tabel hebt gemaakt:

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

Een opgeslagen procedure gebruiken om statistieken te maken voor alle kolommen in een SQL-pool

Toegewezen SQL-pool heeft geen door het systeem opgeslagen procedure die gelijk is aan sp_create_stats in SQL Server. Met deze opgeslagen procedure maakt u één kolomstatistiekenobject op elke kolom in een SQL-pool die nog geen statistieken heeft.

In het volgende voorbeeld ziet u hoe u aan de slag gaat met het ontwerp van uw SQL-pool. U kunt het aanpassen aan uw behoeften.

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;

Als u statistieken wilt maken voor alle kolommen in de tabel met behulp van de standaardwaarden, voert u de opgeslagen procedure uit.

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

Als u statistieken wilt maken voor alle kolommen in de tabel met behulp van een volledige scan, roept u deze procedure aan.

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

Als u steekproefstatistieken wilt maken voor alle kolommen in de tabel, voert u 3 en het steekproefpercentage in. In deze procedure wordt een steekproeffrequentie van 20 procent gebruikt.

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

Voorbeelden: Statistieken bijwerken

Als u statistieken wilt bijwerken, kunt u het volgende doen:

  • Werk één statistiekenobject bij. Geef de naam op van het statistiekenobject dat u wilt bijwerken.
  • Werk alle statistiekenobjecten in een tabel bij. Geef de naam van de tabel op in plaats van één specifiek statistiekenobject.

Eén specifiek statistiekenobject bijwerken

Gebruik de volgende syntaxis om een specifiek statistiekenobject bij te werken:

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

Voorbeeld:

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

Door specifieke statistiekenobjecten bij te werken, kunt u de tijd en resources minimaliseren die nodig zijn om statistieken te beheren. Hiervoor moet u nadenken over het kiezen van de beste statistiekenobjecten die moeten worden bijgewerkt.

Alle statistieken in een tabel bijwerken

Een eenvoudige methode voor het bijwerken van alle statistiekenobjecten in een tabel is:

UPDATE STATISTICS [schema_name].[table_name];

Voorbeeld:

UPDATE STATISTICS dbo.table1;

De UPDATE STATISTICS instructie is eenvoudig te gebruiken. Vergeet niet dat alle statistieken in de tabel worden bijgewerkt en daarom meer werk kunnen uitvoeren dan nodig is. Als de prestaties geen probleem zijn, is dit de eenvoudigste en meest volledige manier om te garanderen dat statistieken up-to-date zijn.

Notitie

Wanneer u alle statistieken in een tabel bijwerkt, voert een toegewezen SQL-pool een scan uit om de tabel voor elk statistiekenobject te samplen. Als de tabel groot is en veel kolommen en veel statistieken bevat, is het mogelijk efficiënter om afzonderlijke statistieken bij te werken op basis van behoefte.

Zie Tijdelijke tabellen voor een implementatie van een UPDATE STATISTICS procedure. De implementatiemethode verschilt enigszins van de voorgaande CREATE STATISTICS procedure, maar het resultaat is hetzelfde.

Zie Statistieken bijwerken voor de volledige syntaxis.

Metagegevens van statistieken

Er zijn verschillende systeemweergaven en -functies die u kunt gebruiken om informatie over statistieken te vinden. U kunt bijvoorbeeld zien of een statistiekenobject verouderd is met behulp van de functie stats-date om te zien wanneer statistieken voor het laatst zijn gemaakt of bijgewerkt.

Catalogusweergaven voor statistieken

Deze systeemweergaven bieden informatie over statistieken:

Catalogusweergave Beschrijving
sys.columns Eén rij voor elke kolom
sys.objects Eén rij voor elk object in de database
sys.schemas Eén rij voor elk schema in de database
sys.stats Eén rij voor elk statistiekenobject
sys.stats_columns Eén rij voor elke kolom in het statistiekenobject; koppelingen terug naar sys.columns
sys.tables Eén rij voor elke tabel (inclusief externe tabellen)
sys.table_types Eén rij voor elk gegevenstype

Systeemfuncties voor statistieken

Deze systeemfuncties zijn handig voor het werken met statistieken:

Systeemfunctie Beschrijving
STATS_DATE Datum waarop het statistiekenobject voor het laatst is bijgewerkt
DBCC-SHOW_STATISTICS Samenvattingsniveau en gedetailleerde informatie over de verdeling van waarden zoals begrepen door het statistiekenobject

Statistiekenkolommen en -functies combineren in één weergave

Deze weergave bevat kolommen die betrekking hebben op statistieken en resultaten van de STATS_DATE() functie.

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() voorbeelden

DBCC SHOW_STATISTICS() geeft de gegevens weer die zijn opgeslagen in een statistiekenobject. Deze gegevens zijn in drie delen beschikbaar:

  • Koptekst
  • Dichtheidsvector
  • Histogram

De metagegevens van de header over de statistieken. In het histogram wordt de verdeling van waarden weergegeven in de eerste sleutelkolom van het statistiekenobject. De dichtheidsvector meet de correlatie tussen kolommen.

Notitie

Toegewezen SQL-pool berekent kardinaliteitschattingen met een van de gegevens in het statistiekenobject.

Koptekst, dichtheid en histogram weergeven

In dit eenvoudige voorbeeld ziet u alle drie de onderdelen van een statistiekenobject:

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

Voorbeeld:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1);

Een of meer onderdelen van DBCC weergeven SHOW_STATISTICS()

Als u alleen specifieke onderdelen wilt bekijken, gebruikt u de WITH component en geeft u op welke onderdelen u wilt zien:

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

Voorbeeld:

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

DBCC SHOW_STATISTICS() verschillen

DBCC SHOW_STATISTICS() wordt strikter geïmplementeerd in een toegewezen SQL-pool in vergelijking met SQL Server:

  • Niet-gedocumenteerde functies worden niet ondersteund.
  • Kan niet gebruiken Stats_stream.
  • Kan geen resultaten samenvoegen voor specifieke subsets van statistiekengegevens. Bijvoorbeeld: STAT_HEADER JOIN DENSITY_VECTOR.
  • NO_INFOMSGS kan niet worden ingesteld voor berichtonderdrukking.
  • Vierkante haken rond namen van statistieken kunnen niet worden gebruikt.
  • Kan geen kolomnamen gebruiken om statistiekenobjecten te identificeren.
  • Aangepaste fout 2767 wordt niet ondersteund.

Uw toegewezen SQL-poolworkload van Azure Synapse Analytics bewaken met behulp van DMV's