Kontrollera statistikprecisionen för en dedikerad SQL-pool
Gäller för: Azure Synapse Analytics
Uppdaterad statistik är avgörande för att skapa en optimal körningsplan. Det finns två olika perspektiv som du bör utvärdera när det gäller att fastställa statistiknoggrannhet:
Steg 1: Kontrollera noggrannheten för kontrollnodernas radantal
I den dedikerade SQL-poolen måste den primära motorn för att skapa distribuerade frågeplaner hållas uppdaterad om antalet rader på beräkningsnoderna. Kör följande fråga för att identifiera tabeller med skillnader mellan radantalen:
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
,'UPDATE STATISTICS ' + quotename(actualRowCounts.[schema]) + '.' + quotename(actualRowCounts.logical_table_name) + ';' as update_stats_stmt
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
INNER JOIN sys.indexes ind on tb.object_id = ind.object_id
WHERE rg.index_id < 2 -- In case this condition removed the number of rows will gets duplicated based on the number of index.
AND ind.type_desc IN ('CLUSTERED COLUMNSTORE', 'HEAP') -- Switch between the CCI (Column store) and HEAP, You should at least keep one value or else the total number of rows will gets duplicated based on the number of indexes.
GROUP BY sm.name
,tb.name
,tb.object_id
) actualRowCounts ON objIdsWithStats.object_id = actualRowCounts.object_id
Steg 2: Kontrollera att statistiken är uppdaterad
Uppdatering av data kan avsevärt påverka de statistik histogram som används för att generera effektiva körningsplaner. Kör följande fråga för att avgöra om datumet då statistiken uppdaterades senast överensstämmer med tabellens ändringsmönster:
SELECT ob.[object_id],max(sm.[name]) AS [schema_name]
,max(tb.[name]) AS [table_name]
,st.[stats_id]
,max(st.[name]) AS [stats_name]
,string_agg(co.[name], ',') AS [stats_column_names]
,STATS_DATE(ob.[object_id], st.[stats_id]) AS [stats_last_updated_date]
,'UPDATE STATISTICS ' + quotename(max(sm.[name])) + '.' + quotename(max(tb.[name])) + ';' as [update_stats_stmt]
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.[stats_id] > 1
GROUP BY ob.[object_id], st.[stats_id]
ORDER BY stats_last_updated_date
Steg 3: Uppdatera statistik om identifierade tabeller
När du har identifierat kandidattabeller i föregående steg kör du de instruktioner som genererades i kolumnen i update_stats_stmt
frågorna för att uppdatera statistiken.
Kommentar
Vi rekommenderar inte att du uppdaterar individuell statistik, inte ens när användaren har skapat den. Genom att köra UPDATE STATISTICS
utan att ange ett statistiknamn uppdateras all statistik som är associerad med tabellen samt kontrollnodernas radantal. Du kan överväga att åsidosätta standardgenomsökningsprocenten med hjälp WITH FULLSCAN
av eller WITH SAMPLE <SamplePercent> PERCENT
för att uppnå lämplig noggrannhet för stora tabeller. Fullständig syntax finns i UPPDATERA STATISTIK (Transact-SQL).
Till exempel:
UPDATE STATISTICS [dbo].[MyAwesomeTable];
När du har uppdaterat statistiken kör du problemfrågan igen för att avgöra om statistikuppdateringarna har förbättrat körningstiden.