Me encuentro con un problema extraño que ocurre al acceder a registros históricos dentro de una tabla temporal. Las consultas que acceden a las entradas más antiguas en la tabla temporal a través de la subcláusula AS OF tardan más que las consultas en entradas históricas recientes.
La tabla histórica fue generada por SQL Server (incluye un índice agrupado en las columnas de fecha y usa compresión de página), agregué 50 millones de filas a la tabla histórica y mis consultas recuperaron alrededor de 25,000 filas.
He intentado determinar la causa raíz del problema, pero no he podido identificarlo. Hasta ahora he probado:
- Crear una tabla de prueba con 50 millones de filas con un índice agrupado para ver si la desaceleración se debió simplemente al volumen. Pude recuperar 25K filas en tiempo constante (~ 400ms).
- Eliminando la compresión de página de la tabla histórica. Eso no tuvo ningún efecto en el tiempo de recuperación, pero sí aumentó significativamente el tamaño de la tabla.
- Intenté acceder a las filas de la tabla de historial directamente usando una columna de identificación frente a las columnas de fecha. Aquí es donde las cosas fueron un poco más interesantes. Pude acceder a filas más antiguas en la tabla a ~ 400 ms donde, como con la subcláusula AS OF, tomaría ~ 1200 ms. Traté de filtrar en mi tabla de prueba en la columna de fecha y noté una desaceleración similar en comparación con el filtrado en la columna de ID. Esto me lleva a creer que las comparaciones de fechas están detrás de parte de la desaceleración.
Quiero ver esto más, pero también quiero asegurarme de no ladrar al árbol equivocado. Primero, ¿alguien más ha experimentado este mismo comportamiento al acceder a datos históricos más antiguos en una tabla temporal (solo notamos desaceleraciones que pasaron 10 millones de filas)? En segundo lugar, ¿cuáles son algunas estrategias que puedo usar para aislar aún más la causa raíz del problema de rendimiento (acabo de comenzar a buscar planes de ejecución pero todavía es un poco críptico para mí)?
Planes de ejecucion
Estas son consultas de recuperación simples: la primera accede a las filas más antiguas, la segunda accede a las filas más nuevas.
Filas más antiguas ~ 1200 ms de tiempo de ejecución
Filas recientes ~ 350 ms de tiempo de ejecución
Detalles de la tabla
Estas son las columnas en la tabla temporal. La tabla de historial tiene las mismas columnas pero no tiene una clave primaria (según los requisitos de la tabla de historial):
A continuación se muestran los índices en la tabla de historial:
fuente