Eu queria testar MAXDOP
no meu computador. Portanto, defino MAXDOP
como 2 para uma consulta específica. No entanto, quando olhei para meus processadores lógicos no Gerenciador de Tarefas enquanto executava a consulta, parecia que todos estavam sendo usados. Eu pensei que só estaria usando 2 processadores lógicos se MAXDOP
fosse definido como 2? Alguém sabe o que está acontecendo? Por favor, veja a imagem abaixo.
Outro problema é que o DOP
retornado pelo plano de execução é 1. Agora sei que essa configuração MAXDOP
não significa que o SQL Server realmente usará o número definido. No entanto, como parecia que todos os meus 4 processadores lógicos estavam sendo usados para processar a consulta, ficou ainda mais estranho ver DOP
1.
Esta é a consulta que executei:
Isso foi o que aconteceu enquanto eu o executava (ou seja, parece que todos os 4 processadores lógicos estão sendo usados para executar a consulta):
A consulta é um plano não paralelo (serial), portanto, é definitivamente executada do início ao fim em um único thread de trabalho do SQL Server , associado a um único agendador do SQLOS .
Do ponto de vista do sistema operacional, esse único thread ainda está sujeito aos algoritmos normais de agendamento do Windows por padrão. Digo "por padrão" porque o comportamento depende da configuração da máscara de afinidade da CPU .
Por padrão, a máscara é toda em zeros, o que significa que o Windows pode escolher em qual unidade de execução física (por exemplo, núcleo) executar o thread por fatia de tempo. Quando a máscara de afinidade da CPU é definida como 1 para o agendador em questão, o agendador fica vinculado a uma unidade de processamento físico específica o tempo todo.
Portanto, um thread do SQL Server em execução a 100% tenderá a pular unidades físicas, levando a um padrão "manchado". Quando a máscara de afinidade estiver definida, você verá um pico mais limpo na atividade porque o Windows não tem permissão para mover o thread.
Dito isso, o padrão que você vê no Gerenciador de Tarefas não é uma ótima maneira de examinar a atividade da CPU do SQL Server. O SQL Server não é o único processo em execução quando sua consulta é executada - você também está vendo o uso da CPU pelo SSMS recebendo resultados e gravando-os na tela, por exemplo.
O SQL Server fornece uma variedade de objetos de gerenciamento dinâmico para examinar itens como agendadores, trabalhadores e threads. Há ainda mais para ver o status das sessões atuais, solicitações e assim por diante.
Caso esses conceitos sejam novos para você, consulte o artigo da TechNet, SQL Server Batch ou Task Scheduling e o conteúdo relacionado.
A
MAXDOP
dica de consulta limita apenas o número total de agendadores que uma consulta pode usar. No momento da compilação, o otimizador pode decidir entre um plano serial e um plano paralelo, com base em estimativas de custo. Para uma consulta muito simplesSELECT
como a da pergunta, o otimizador geralmente escolherá um plano de execução 'trivial', que nunca usa paralelismo.