Estamos usando SQL Server 2005 para rastrear una buena cantidad de datos constantemente entrantes (5-15 actualizaciones por segundo). Nos dimos cuenta después de que ha estado en producción durante un par de meses que una de las tablas ha comenzado a tomar una cantidad obscena de tiempo para consultar.Pregunta lenta distinta en SQL Server en un conjunto de datos grande
La tabla tiene 3 columnas:
id
- autonumber (agrupado)typeUUID
- GUID generado antes de que ocurra el inserto; se utiliza para agrupar los tipos juntostypeName
- El nombre del tipo (duh ...)
Una de las consultas que corremos es un distintivo en el campo typeName
:
SELECT DISTINCT [typeName] FROM [types] WITH (nolock);
El typeName
campo tiene un índice ascendente no agrupado, no único en él. La tabla contiene aproximadamente 200 millones de registros en este momento. Cuando ejecutamos esta consulta, ¡la consulta tardó 5m 58s en volver! Quizás no estamos entendiendo cómo funcionan los índices ... Pero no pensé que los entendiéramos mal que mucho.
Para probar esto un poco más, nos encontramos con la siguiente consulta:
SELECT DISTINCT [typeName] FROM (SELECT TOP 1000000 [typeName] FROM [types] WITH (nolock)) AS [subtbl]
Esta consulta devuelve en unos 10 segundos, lo que cabe esperar, que está escaneando la tabla.
¿Hay algo que nos falta aquí? ¿Por qué la primera consulta toma tanto tiempo?
Edit: Ah, disculpas, la primera consulta devuelve 76 registros, gracias ninesided.
Seguimiento: Gracias a todos por sus respuestas, tiene más sentido para mí ahora (no sé por qué no lo hizo antes ...). Sin un índice, está haciendo un escaneo de tabla en 200M filas, con un índice, está haciendo un escaneo de índice en 200M filas ...
SQL Server prefiere el índice, y da un poco de un aumento de rendimiento , pero no hay nada de lo que emocionarse. Reconstruir el índice redujo el tiempo de consulta a poco más de 3m en lugar de 6m, una mejora, pero no suficiente. Voy a recomendar a mi jefe que normalicemos la estructura de la mesa.
¡Una vez más, gracias a todos por su ayuda!
¿Cuántos tipos distintos esperas normalmente? – ninesided
Honestamente, parece que su diseño es fundamentalmente defectuoso. 200M registros en una tabla "entrante"? ¿No puedes empujarlos a otro lugar después de que han estado por aquí un rato? Es difícil dar un mejor consejo sin entender su aplicación, pero parece que es posible que necesite una refactorización seria. – kquinn
Sí, tenemos muchos datos con los que estamos lidiando, actualmente eso equivale a 4 meses de datos. Vamos a necesitar dividir los datos, pero todavía no hemos llegado. – Miquella