Corrija-me se estiver enganado, mas pelo que entendi, quando uma consulta está sendo agendada para execução, o mecanismo leva em consideração o número de threads livres disponíveis e ajustará o plano de consulta de acordo.
Por exemplo, se uma máquina estiver altamente carregada de modo que apenas um único thread esteja livre, uma consulta que normalmente é executada usando vários threads em uma máquina descarregada pode ser executada como um único thread.
Existe uma maneira de consultar dinamicamente o número de threads livres disponíveis para que uma consulta crítica específica (que seja executada inaceitavelmente como MaxDop < X) possa ser atrasada (enquanto/espera) para execução até que uma contagem mínima de threads livres esteja disponível?
Atualização: Um ponto de partida baseado na resposta de Kin:
Isso parece seguir um teste de carga simples, mas nunca retorna todo ocioso por algum motivo. Não sei nada sobre esta mesa.
select count(*) as Cpus,
sum(IsIdle) + 1 as IdleCpus -- +1 since current query should be excluded
from
(
select Cpu_id,
min(convert(int, is_idle)) IsIdle
from sys.dm_os_schedulers
group by Cpu_id
) q
;
Não existe tal conceito como grau mínimo de paralelismo.
SQL Server tem grau máximo de paralelismo (máximo DOP) e limite de custo de paralelismo. Essas 2 configurações são usadas pelo otimizador baseado em custo do sql server no número de threads a serem usados para executar consultas.
Se uma máquina estiver muito carregada ou uma consulta de fuga monopolizar o servidor, você entrará em inanição de thread , onde esgotará os threads de trabalho disponíveis. Você deve ajustar a configuração de dop máximo para um valor sensato e testá-lo.
A consulta abaixo ajudará você a fornecer informações sobre as tarefas do sistema que geraram os tópicos adicionais
Como alternativa, você pode verificar
sys.dm_os_waiting_tasks
quaisquerTHREADPOOL
esperas relacionadas. Além disso,sys.dm_os_scheduler
irá dizer-lhe ocurrent_workers_count
para cada agendador.Você pode ter alguma lógica complexa incorporada para verificar a contagem atual de trabalhadores e, em seguida, ter apenas um
waitfor delay x
onde x é o atraso desejado. Na minha opinião, será um exagero complicar desnecessariamente as coisas.O melhor é ajustar o maxdop, limite de custo do paralelismo, além de garantir que as estatísticas estejam atualizadas e coletar as estatísticas de espera para sua instância. Resumindo, faça a linha de base do seu servidor e veja se você detecta alguma anomalia e, em seguida, inicie o exercício de ajuste.
Você usaria um Pool de Recursos do Administrador de Recursos . Ele não especifica diretamente o grau de paralelismo para uma consulta específica, mas pode definir a disponibilidade mínima e máxima de recursos de CPU para uma conexão.
Então
Ao atribuir a sessão que executa a consulta paralela a um conjunto de recursos com MIN_CPU_PERCENT definido, você pode garantir que os planejadores sejam disponibilizados para executar o plano.