Estoy intentando depurar un procedimiento almacenado bastante complejo que se une a muchas pestañas (10-11). Estoy viendo que para una parte del árbol el número estimado de filas difiere drásticamente del número real de filas: en el peor de los casos, SQL Server estima que se devolverá 1 fila, ¡cuando en realidad se devuelven 55,000 filas!¿Cómo funciona SQL Server el número estimado de filas?
Estoy tratando de averiguar por qué esto es así - todas mis estadísticas están actualizadas, y he actualizado las estadísticas con un FULLSCAN en varias tablas. No estoy usando ninguna función definida por el usuario o variables de tabla. Por lo que puedo ver, SQL Server debería ser capaz de estimar exactamente cuántas filas se van a devolver, pero continúa eligiendo un plan que lo lleva a realizar decenas de miles de búsquedas de RDI (cuando espera realizar solo 1) o 2).
¿Qué puedo hacer para tratar de comprender por qué la cantidad estimada de filas se ha reducido tanto?
ACTUALIZACIÓN: Así que mirar el plan que he encontrado un nodo en particular, que parece suspicous - es un recorrido de tabla en una tabla utilizando la siguiente predecate:
status <> 5
AND [type] = 1
OR [type] = 2
Este predicado devuelve toda la tabla (630 filas, la tabla escanea por sí misma, NO es la fuente del bajo rendimiento); sin embargo, el servidor SQL tiene el número estimado de filas a solo 37. El servidor SQL luego realiza varios ciclos anidados con esto en búsquedas RDI, escaneos de índice e índice busca. ¿Podría ser esta la fuente de mi gran error de cálculo? ¿Cómo hago para estimar un número más razonable de filas?
¿Podría publicar la definición de la tabla y la consulta completa? – Quassnoi
Lo siento, pero no realmente, es demasiado grande (250 líneas sp + 10 tablas). – Justin
Si su predicado es exactamente así (sin corchetes), entonces puede tener un problema de lógica. Y tiene prioridad sobre OR. Debe ser [estado] <> 5 Y (tipo = 1 O tipo = 2) – GilaMonster