Como altero o valor padrão de todo o sistema MAXRECURSION
?
Por padrão, é 100, mas preciso aumentá-lo para algo como 1000.
Não consigo usar dicas de consulta, pois estou usando um programa que pega minha consulta e a executa para mim e, infelizmente, não consigo contornar essa limitação.
No entanto, eu tenho direitos de administrador na instância do servidor. Eu dei uma olhada nas facetas do servidor, mas não vejo nada relacionado a opções de consulta ou recursão. Suponho que deve haver um lugar em algum lugar onde eu possa atualizar o padrão de todo o sistema.
Alguma ideia?
sql-server
configuration
recursive
carl.anderson
fonte
fonte
Respostas:
Se suas consultas tiverem um formato comum, você poderá adicionar a dica de maxrecursão necessária usando um ou mais guias de plano.
Pode haver um jeito de acertar. Se você adicionar detalhes específicos da consulta à sua pergunta, poderemos resolver isso para você. Normalmente, você rastreia o SQL que realmente está atingindo o servidor ou obtém um formulário parametrizado usando o procedimento interno sys.sp_get_query_template e cria um guia de plano TEMPLATE e / ou OBJECT / SQL.
Consulte a documentação para obter mais informações:
Os guias de plano precisarão ser revalidados sempre que o código do aplicativo for alterado e quando o SQL Server for corrigido ou atualizado. Isso deve fazer parte do seu ciclo de testes normal.
Observe que a validação do guia de plano usando sys.fn_validate_plan_guide pode relatar incorretamente uma falha se a instrução guiada fizer referência a uma tabela temporária. Veja esta pergunta:
A validação do guia de plano com fn_validate_plan_guide fornece falsos positivos
As classes Guia de plano bem - sucedido e Guia de plano sem êxito e Eventos estendidos também podem ser usadas para monitorar aplicativos de guia de plano.
O Connect foi retirado antes da sugestão de melhoria do produto Permitir que valores-limite de MAXRECURSION diferentes de 100 para visualizações e UDFs de Steve Kass fossem implementados. Se você deseja fazer parte da Microsoft agora, consulte as opções na ajuda e nos comentários do SQL Server .
fonte
Se você precisar absolutamente usar uma função (uma limitação da sua ferramenta ETL, como você sugere), poderá especificar
OPTION
como parte de uma função com valor de tabela com várias instruções, por exemplo, algo como isto:Isso também funcionou para mim quando envolvido em uma exibição, como você sugere suas ferramentas ETL. Não há como alterar isso em todo o sistema, mas como a recursão pode ser ineficiente, isso provavelmente é uma coisa boa. Você não pode especificar uma dica de consulta (usando
OPTION
) no corpo de uma função embutida com valor de tabela, como no seu exemplo.Considere alterar seu processo para percorrer a hierarquia apenas uma vez ao receber seus episódios e armazenar a saída em uma tabela relacional. Você pode usar um procedimento armazenado para fazer isso, para não entrar nessa limitação.
Eu também acho que pode haver um erro no seu código: se o seu CTE se unir a personId e se repetir em eventId, o eventId 101 apresentaria duas vezes, como uma duplicata. Possivelmente, eu interpretei mal o seu código, deixe-me saber o que você pensa.
HTH
fonte
Eu me inspirei neste tópico .
Aqui está o que eu fiz para resolver o problema.
Então eu invoco esta função assim:
Dessa forma, nenhuma das minhas lógicas CTE precisa ser repetida e eu não pago nada a mais em termos de desempenho. É um incômodo que isso tenha que ser feito dessa maneira, mas eu posso viver com isso.
fonte
where
cláusula após as reticências impede que ocorram muitas recursões usando o parâmetro de função como restrição. Acho que deveria haver uma declaração após a definição da CTE. Vou acrescentar isso.EventID=1
(e 101,201, ... 901). Mas a consulta original (se executada com MAXRECURSION = 100000000) pode nunca visitar a linha comEventID=101
(e 201, .., 901). Portanto, as duas consultas (original e sua solução) podem retornar resultados diferentes (nenhuma linha com 101 na primeira, sim na segunda)! Ou pode visitar o 101, mas antes do passo 100, então sua solução incluiria a linha duas vezes nos resultados (novamente diferente)