¿Por qué SQL Server se niega a actualizar estas estadísticas con otra cosa que no sea fullscan?

13

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 tempdbcon el nivel de derrame 2.

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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.

Martin Smith
fuente

Respuestas:

10

Lo primero que intentaría es actualizar la instancia de SQL Server de SP1 CU16 con QFE que tiene ahora, a SP3 CU1 (compilación actual de 2012) y luego volver a probar para ver si el comportamiento es el mismo.

Por ejemplo:

REVISIÓN: ACTUALIZAR ESTADÍSTICAS realiza muestreo y procesamiento incorrectos para una tabla con índice de almacén de columnas en SQL Server

... publicado por primera vez en SP2 CU2 puede ser relevante.

Dicho esto, no estoy seguro de si el almacén de columnas 2012 admite la muestra de tabla, necesaria para las estadísticas muestreadas. Actualizaré esta respuesta una vez que haya un repro en la pregunta.

Paul White 9
fuente
1
(Con respecto al último párrafo) se SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsIdejecuta en menos de 30 segundos para mí. Sin embargo, no usa el índice del almacén de columnas. Utiliza el índice agrupado.
Martin Smith
2
Sí, definitivamente parece algo solucionado en versiones posteriores. Produje una reproducción simple aquí pastebin.com/7f4TwmKW y en un servidor de prueba que ejecuta 11.0.5343.0 encontré que mi solicitud para un tamaño de muestra de 10,000 filas fue ignorada y todas las 8,000,000 filas muestreadas i.stack.imgur.com/DbbjZ.png (plan casi lo mismo que en la pregunta) - Pero no encuentro esto en Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (las filas muestreadas son 274,649, lo cual está bastante cerca del número estimado de filas en la compilación anterior y el plan utiliza el CI en lugar del almacén de columnas.)
Martin Smith