Comment modifier la valeur par défaut de l'ensemble du système MAXRECURSION
?
Par défaut, il est de 100, mais je dois l'augmenter à quelque chose comme 1000.
Je ne peux pas utiliser d'indices de requête car j'utilise un programme qui prend ma requête et l'exécute pour moi et je ne peux malheureusement pas contourner cette limitation.
Cependant, j'ai des droits d'administrateur sur l'instance de serveur. J'ai fouillé dans les facettes du serveur, mais je n'y vois rien lié aux options de requête ou à la récursivité. Je suppose qu'il doit y avoir un endroit quelque part où je peux mettre à jour la valeur par défaut à l'échelle du système.
Des idées?
sql-server
configuration
recursive
carl.anderson
la source
la source
Réponses:
Si vos requêtes ont une forme commune, vous pourrez peut-être ajouter le conseil maxrecursion requis à l'aide d'un ou de plusieurs guides de plan.
Il peut y avoir un talent pour les faire correctement. Si vous ajoutez des détails de requête spécifiques à votre question, nous pourrons peut-être les résoudre pour vous. En règle générale, vous suivrez le SQL qui frappe réellement le serveur ou vous obtiendrez un formulaire paramétré à l'aide de la procédure intégrée sys.sp_get_query_template , puis vous créerez un guide de plan TEMPLATE et / ou OBJECT / SQL.
Voir la documentation pour plus d'informations:
Les guides de plan devront être revalidés chaque fois que le code d'application change et lorsque SQL Server est corrigé ou mis à niveau. Cela devrait simplement faire partie de votre cycle de test normal.
Notez que la validation du guide de plan à l'aide de sys.fn_validate_plan_guide peut signaler de manière incorrecte un échec si l'instruction guidée fait référence à une table temporaire. Voir cette question:
La validation du guide de plan avec fn_validate_plan_guide donne des faux positifs
Les classes Plan Guide Successful et Plan Guide Unsuccessful Profiler et Extended Events peuvent également être utilisées pour surveiller les applications de guide de plan.
Connect a été retiré avant la mise en œuvre de la suggestion d'amélioration du produit Autoriser les valeurs limites MAXRECURSION autres que 100 pour les vues et les FDU de Steve Kass . Si vous souhaitez en discuter avec Microsoft maintenant, consultez les options de l' aide et des commentaires de SQL Server .
la source
Si vous devez absolument utiliser une fonction (une limitation de votre outil ETL comme vous l'impliquez), vous pouvez spécifier
OPTION
dans le cadre d'une fonction table multi-instructions, par exemple quelque chose comme ceci:Cela a également fonctionné pour moi lorsqu'il est enveloppé dans une vue, comme vous le suggérez pour vos outils ETL. Il n'y a aucun moyen de modifier ce système, mais comme la récursivité peut être inefficace, c'est probablement une bonne chose. Vous ne pouvez pas spécifier d'indicateur de requête (à l'aide
OPTION
) dans le corps d'une fonction de valeur de table en ligne, comme dans votre exemple.Envisagez de modifier votre processus pour parcourir la hiérarchie une seule fois lorsque vous recevez vos épisodes et stockez la sortie dans une table relationnelle. Vous pouvez utiliser un proc stocké pour ce faire afin de ne pas rencontrer cette limitation.
Je pense également qu'il pourrait y avoir un bug dans votre code: si votre CTE se joint à personId et se reproduit sur eventId, le eventId 101 présenterait deux fois je pense, en double. J'ai peut-être mal interprété votre code, faites-moi savoir ce que vous en pensez.
HTH
la source
Je me suis inspiré de ce sujet .
Voici ce que j'ai fait pour résoudre le problème.
Ensuite, j'appelle cette fonction comme ceci:
De cette façon, aucune de mes logiques CTE ne doit être répétée et je ne paie rien de plus en termes de performances. C'est une nuisance que cela doive être fait de cette façon, mais je peux vivre avec.
la source
where
clause après les points de suspension empêche trop de récursions de se produire en utilisant le paramètre de fonction comme contrainte. Je suppose qu'il devrait y avoir une déclaration après la définition CTE, cependant. Je vais ajouter ça.EventID=1
(et 101,201, ... 901). Mais la requête d'origine (si exécutée avec MAXRECURSION = 100000000) peut ne jamais visiter la ligne avecEventID=101
(et 201, .., 901). Ainsi, les deux requêtes (d'origine et votre solution) peuvent renvoyer des résultats différents (pas de ligne avec 101 dans la première, oui dans la 2ème)! Ou il peut visiter le 101 mais avant l'étape 100, donc votre solution inclurait la ligne deux fois dans les résultats (encore différent)