¿Cómo cambio el valor predeterminado de todo el sistema de MAXRECURSION
?
Por defecto es 100, pero necesito aumentarlo a algo así como 1000.
No puedo usar sugerencias de consulta ya que estoy usando un programa que toma mi consulta y la ejecuta por mí y desafortunadamente no puedo evitar esta limitación.
Sin embargo, tengo derechos de administrador en la instancia del servidor. He hurgado en las facetas del servidor, pero no veo nada relacionado con las opciones de consulta o la recursividad. Supongo que tiene que haber un lugar en algún lugar donde pueda actualizar el valor predeterminado de todo el sistema.
¿Algunas ideas?
sql-server
configuration
recursive
carl.anderson
fuente
fuente
Respuestas:
Si sus consultas tienen una forma común, es posible que pueda agregar la sugerencia de recursión máxima requerida utilizando una o más guías de plan.
Puede haber una habilidad especial para acertar. Si agrega detalles específicos de la consulta a su pregunta, podríamos resolverlo por usted. Por lo general, debe rastrear el SQL que realmente está llegando al servidor, u obtener un formulario parametrizado utilizando el procedimiento incorporado sys.sp_get_query_template , y luego crear una guía de plan TEMPLATE y / u OBJECT / SQL.
Consulte la documentación para obtener más información:
Las guías de plan deberán revalidarse cada vez que cambie el código de la aplicación y cuando se parche o actualice SQL Server. Esto debería ser parte de su ciclo de prueba normal.
Tenga en cuenta que la validación de la guía del plan utilizando sys.fn_validate_plan_guide puede informar incorrectamente un error si la instrucción guiada hace referencia a una tabla temporal. Ver esta pregunta:
La validación de la guía del plan con fn_validate_plan_guide da falsos positivos
Las clases Planificador exitoso y Planificador exitoso de la guía del plan y Eventos extendidos también se pueden usar para monitorear las aplicaciones de la guía del plan.
Connect se retiró antes de la sugerencia de mejora del producto Permitir valores límite MAXRECURSION distintos de 100 para vistas y UDF de Steve Kass se implementó. Si desea abordarlo ahora con Microsoft, consulte las opciones en la ayuda y comentarios de SQL Server .
fuente
Si tiene que usar absolutamente una función (una limitación de su herramienta ETL como usted lo implica), puede especificar
OPTION
como parte de una función con valores de tabla de varias instrucciones, por ejemplo, algo como esto:Esto también funcionó para mí cuando se envolvió en una vista, como sugiere que sus herramientas ETL lo hacen. No hay forma de alterar este sistema, pero como la recursión puede ser ineficiente, probablemente sea algo bueno. No puede especificar una sugerencia de consulta (usando
OPTION
) dentro del cuerpo de una función con valores de tabla en línea, como en su ejemplo.Considere modificar su proceso para recorrer la jerarquía solo una vez cuando reciba sus Episodios y almacene la salida en una tabla relacional. Puede usar un proceso almacenado para hacer esto, de modo que no se encuentre con esta limitación.
También creo que puede haber un error en su código: si su CTE se une a personId y se repite en eventId, el eventId 101 se presentaría dos veces, creo, como un duplicado. Posiblemente he malinterpretado su código, hágame saber lo que piensa.
HTH
fuente
Me inspiré en este tema .
Esto es lo que he hecho para resolver el problema.
Luego invoco esta función así:
De esta manera, nada de mi lógica CTE tiene que repetirse y no pago nada extra en términos de rendimiento. Es una molestia que tenga que hacerse de esta manera, pero puedo vivir con eso.
fuente
where
cláusula después de los puntos suspensivos evita que se produzcan demasiadas recursiones utilizando el parámetro de función como restricción. Sin embargo, supongo que debería haber una declaración después de la definición de CTE. Agregaré eso.EventID=1
(y 101,201, ... 901). Pero la consulta original (si se ejecuta con MAXRECURSION = 100000000) puede que nunca visite la fila conEventID=101
(y 201, .., 901). Por lo tanto, las dos consultas (original y su solución) pueden devolver resultados diferentes (sin fila con 101 en la primera, sí en la segunda). O puede visitar el 101 pero antes del paso 100, por lo que su solución incluiría la fila dos veces en los resultados (nuevamente diferente)