Noté una operación de estadísticas de actualización automática de ejecución relativamente larga (20 min +) en una compilación diaria de datawarehouse. La mesa involucrada es
CREATE TABLE [dbo].[factWebAnalytics](
[WebAnalyticsId] [bigint] IDENTITY(1,1) NOT NULL,
[MarketKey] [int] NOT NULL CONSTRAINT [DF_factWebAnalytics_MarketKey] DEFAULT ((-1)),
/*Other columns removed*/
CONSTRAINT [PK_factWebAnalytics] PRIMARY KEY CLUSTERED
(
[MarketKey] ASC,
[WebAnalyticsId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [MarketKeyPS]([MarketKey])
) ON [MarketKeyPS]([MarketKey])
Esto se ejecuta en Microsoft SQL Server 2012 (SP1) - 11.0.3513.0 (X64) por lo que los índices de almacén de columnas grabables no están disponibles.
La tabla contiene datos para dos claves de mercado distintas. La compilación cambia la partición de un MarketKey específico a una tabla de preparación, deshabilita el índice del almacén de columnas, realiza las escrituras necesarias, reconstruye el almacén de columnas y luego lo vuelve a activar.
El plan de ejecución para las estadísticas de actualización muestra que extrae todas las filas de la tabla, las ordena, obtiene el número estimado de filas muy mal y se derrama tempdb
con el nivel de derrame 2.
Corriendo
SELECT [s].[name] AS "Statistic",
[sp].*
FROM [sys].[stats] AS [s]
OUTER APPLY sys.dm_db_stats_properties ([s].[object_id], [s].[stats_id]) AS [sp]
WHERE [s].[object_id] = OBJECT_ID(N'[dbo].[factWebAnalytics]');
Muestra
Si intento explícitamente y reduzco el tamaño de la muestra de las estadísticas de ese índice al utilizado por los demás con
UPDATE STATISTICS [dbo].[factWebAnalytics] [PK_factWebAnalytics] WITH SAMPLE 897667 ROWS
La consulta se ejecuta durante más de 20 minutos y el plan de ejecución muestra que está procesando todas las filas, no la muestra 897,667 solicitada.
Las estadísticas generadas al final de todo esto no son muy interesantes y definitivamente no parecen garantizar el tiempo dedicado a un análisis completo.
Statistics for INDEX 'PK_factWebAnalytics'.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Name Updated Rows Rows Sampled Steps Density Average Key Length String Index
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PK_factWebAnalytics Jan 22 2016 11:31AM 420072086 420072086 2 0 12 NO 420072086
All Density Average Length Columns
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0.5 4 MarketKey
2.380544E-09 12 MarketKey, WebAnalyticsId
Histogram Steps
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 0 3.441652E+08 0 1
2 0 7.590685E+07 0 1
¿Alguna idea de por qué me encuentro con este comportamiento y qué pasos puedo tomar aparte de usarlos NORECOMPUTE
?
Un script de repro está aquí . Simplemente crea una tabla con un PK agrupado y un índice de almacén de columnas e intenta actualizar las estadísticas de PK con un tamaño de muestra bajo. Esto no utiliza particionamiento, lo que muestra que el aspecto de particionamiento no es obligatorio. Sin embargo, el uso de la partición descrita anteriormente empeora las cosas, ya que cambiar la partición y luego volverla a conectar (incluso sin ningún otro cambio) aumentará el número de filas duplicadas en la partición, lo que prácticamente garantiza que las estadísticas serán considerado obsoleto y auto actualizado.
Intenté agregar un índice no agrupado a la tabla como se indica en KB2986627 (ambos filtrados sin filas y luego, cuando eso falló, un NCI no filtrado también sin efecto).
La reproducción no mostró el comportamiento problemático en la compilación 11.0.6020.0 y después de actualizar a SP3 el problema ahora está solucionado.
SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsId
ejecuta en menos de 30 segundos para mí. Sin embargo, no usa el índice del almacén de columnas. Utiliza el índice agrupado.