Statistik i informationslager för infrastrukturresurser

Gäller för: SQL-analysslutpunkt och lager i Microsoft Fabric

Informationslagret i Microsoft Fabric använder en frågemotor för att skapa en körningsplan för en viss SQL-fråga. När du skickar en fråga försöker frågeoptimeraren räkna upp alla möjliga planer och välja den mest effektiva kandidaten. För att avgöra vilken plan som skulle kräva minst omkostnader (I/O, CPU, minne) måste motorn kunna utvärdera mängden arbete eller rader som kan bearbetas hos varje operator. Sedan, baserat på varje plans kostnad, väljer den den med minst mängd uppskattat arbete. Statistik är objekt som innehåller relevant information om dina data, så att frågeoptimeraren kan beräkna dessa kostnader.

Så här använder du statistik

För att uppnå optimala frågeprestanda är det viktigt att ha korrekt statistik. Microsoft Fabric stöder för närvarande följande sökvägar för att tillhandahålla relevant och uppdaterad statistik:

Manuell statistik för alla tabeller

Det traditionella alternativet för att upprätthålla statistikhälsa är tillgängligt i Microsoft Fabric. Användare kan skapa, uppdatera och släppa histogrambaserad statistik med en kolumn med CREATE STATISTICS, UPDATE STATISTICS respektive DROP STATISTICS. Användare kan också visa innehållet i histogrambaserad statistik med en kolumn med DBCC-SHOW_STATISTICS. För närvarande stöds en begränsad version av dessa instruktioner.

  • Om du skapar statistik manuellt bör du överväga att fokusera på dem som används i din frågearbetsbelastning (särskilt i GRUPP-BY:er, ORDER-BY:er, filter och JOIN).
  • Överväg att uppdatera statistik på kolumnnivå regelbundet efter dataändringar som avsevärt ändrar radantal eller distribution av data.

Exempel på manuellt statistikunderhåll

Om du vill skapa statistik i dbo.DimCustomer tabellen, baserat på alla rader i en kolumn CustomerKey:

CREATE STATISTICS DimCustomer_CustomerKey_FullScan
ON dbo.DimCustomer (CustomerKey) WITH FULLSCAN;

Om du vill uppdatera statistikobjektet DimCustomer_CustomerKey_FullScanmanuellt , kanske efter en stor datauppdatering:

UPDATE STATISTICS dbo.DimCustomer (DimCustomer_CustomerKey_FullScan) WITH FULLSCAN;  

Så här visar du information om statistikobjektet:

DBCC SHOW_STATISTICS ("dbo.DimCustomer", "DimCustomer_CustomerKey_FullScan");

Så här visar du endast information om histogrammet för statistikobjektet:

DBCC SHOW_STATISTICS ("dbo.DimCustomer", "DimCustomer_CustomerKey_FullScan") WITH HISTOGRAM;

Så här släpper du statistikobjektet DimCustomer_CustomerKey_FullScanmanuellt:

DROP STATISTICS dbo.DimCustomer.DimCustomer_CustomerKey_FullScan;

Följande T-SQL-objekt kan också användas för att kontrollera både manuellt skapad och automatiskt skapad statistik i Microsoft Fabric:

Automatisk statistik vid fråga

När du utfärdar en fråge- och frågeoptimerare som kräver statistik för planutforskning skapar Microsoft Fabric automatiskt den statistiken om de inte redan finns. När statistik har skapats kan frågeoptimeraren använda dem för att beräkna plankostnaderna för den utlösande frågan. Om frågemotorn dessutom fastställer att befintlig statistik som är relevant för frågan inte längre korrekt återspeglar data, uppdateras den statistiken automatiskt. Eftersom dessa automatiska åtgärder utförs synkront kan du förvänta dig att frågevaraktigheten inkluderar den här tiden om nödvändig statistik ännu inte finns eller om betydande dataändringar har gjorts sedan den senaste statistikuppdateringen.

Verifiera automatisk statistik vid frågetid

Det finns olika fall där du kan förvänta dig någon typ av automatisk statistik. De vanligaste är histogrambaserad statistik, som begärs av frågeoptimeraren för kolumner som refereras till i GRUPP-BY: er, JOIN, DISTINCT-satser, filter (WHERE-satser) och ORDER BYs. Om du till exempel vill se att den här statistiken skapas automatiskt utlöses en fråga om statistik för COLUMN_NAME ännu inte finns. Till exempel:

SELECT <COLUMN_NAME>
FROM <YOUR_TABLE_NAME>
GROUP BY <COLUMN_NAME>;

I det här fallet bör du förvänta dig att statistiken för COLUMN_NAME har skapats. Om kolumnen också var en varchar-kolumn skulle du också se genomsnittlig kolumnlängdsstatistik som skapats. Om du vill verifiera att statistik har skapats automatiskt kan du köra följande fråga:

select
    object_name(s.object_id) AS [object_name],
    c.name AS [column_name],
    s.name AS [stats_name],
    s.stats_id,
    STATS_DATE(s.object_id, s.stats_id) AS [stats_update_date], 
    s.auto_created,
    s.user_created,
    s.stats_generation_method_desc 
FROM sys.stats AS s 
INNER JOIN sys.objects AS o 
ON o.object_id = s.object_id 
INNER JOIN sys.stats_columns AS sc 
ON s.object_id = sc.object_id 
AND s.stats_id = sc.stats_id 
INNER JOIN sys.columns AS c 
ON sc.object_id = c.object_id 
AND c.column_id = sc.column_id
WHERE o.type = 'U' -- Only check for stats on user-tables
    AND s.auto_created = 1
    AND o.name = '<YOUR_TABLE_NAME>'
ORDER BY object_name, column_name;

Den här frågan söker bara efter kolumnbaserad statistik. Om du vill se all statistik som finns för den här tabellen tar du bort JOIN på sys.stats_columns och sys.columns.

Nu kan du hitta statistics_name den automatiskt genererade histogramstatistiken (bör vara ungefär som _WA_Sys_00000007_3B75D760) och köra följande T-SQL:

DBCC SHOW_STATISTICS ('<YOUR_TABLE_NAME>', '<statistics_name>');

Till exempel:

DBCC SHOW_STATISTICS ('sales.FactInvoice', '_WA_Sys_00000007_3B75D760');

Värdet Updated i resultatuppsättningen för DBCC SHOW_STATISTICS ska vara ett datum (i UTC) som liknar när du körde den ursprungliga GROUP BY-frågan.

Dessa automatiskt genererade statistik kan sedan användas i efterföljande frågor av frågemotorn för att förbättra plankostnads- och körningseffektiviteten. Om det sker tillräckligt många ändringar i tabellen uppdaterar frågemotorn även den statistiken för att förbättra frågeoptimeringen. Samma föregående exempelövning kan användas när du har ändrat tabellen avsevärt. I Infrastruktur använder SQL-frågemotorn samma omkompileringströskel som SQL Server 2016 (13.x) för att uppdatera statistik.

Typer av automatiskt genererad statistik

I Microsoft Fabric finns det flera typer av statistik som genereras automatiskt av motorn för att förbättra frågeplaner. För närvarande finns de i sys.stats , men alla är inte användbara:

  • Histogramstatistik
    • Skapad per kolumn som behöver histogramstatistik vid frågetid
    • Dessa objekt innehåller histogram och densitetsinformation om fördelningen av en viss kolumn. Liknar den statistik som skapas automatiskt vid frågetid i dedikerade Azure Synapse Analytics-pooler.
    • Namnet börjar med _WA_Sys_.
    • Innehållet kan visas med DBCC-SHOW_STATISTICS
  • Genomsnittlig kolumnlängdsstatistik
    • Skapad för variabelteckenkolumner (varchar) som är större än 100 och som behöver genomsnittlig kolumnlängd vid frågetiden.
    • Dessa objekt innehåller ett värde som representerar den genomsnittliga radstorleken för kolumnen varchar när statistiken skapas.
    • Namnet börjar med ACE-AverageColumnLength_.
    • Innehållet kan inte visas och kan inte användas av användaren.
  • Tabellbaserad kardinalitetsstatistik
    • Skapad per tabell som behöver kardinalitetsuppskattning vid frågetid.
    • Dessa objekt innehåller en uppskattning av radantalet i en tabell.
    • Med namnet ACE-Cardinality.
    • Innehållet kan inte visas och kan inte användas av användaren.

Begränsningar

  • Endast histogramstatistik med en kolumn kan skapas och ändras manuellt.
  • Det går inte att skapa statistik med flera kolumner.
  • Andra statistikobjekt kan visas i sys.stats, förutom manuellt skapad statistik och automatiskt skapad statistik. Dessa objekt används inte för frågeoptimering.