Eu uso a solução de manutenção de Ola Hallengren há algum tempo, mas nunca usei o parâmetro @DatabasesInParallel. Estou pensando em usar isso nos trabalhos de manutenção de índices e estatísticas, nos quais tenho um único trabalho que dura muito (mais de 4 horas) e tenho algumas perguntas:
Para configurar isso, presumo que o método mais simples seria adicionar
@DatabasesInParallel='Y',
à minha lista de parâmetros no meu trabalho existente do agente SQL Server e, em seguida, no SSMS, executar um Script Job As > Create To... nesse trabalho, para que eu tenha um script criar uma cópia exata e depois apenas alterar @job_name no script para o novo nome do trabalho para que o novo trabalho seja criado com os mesmos parâmetros e use o mesmo agendamento?Posso configurar 3 ou mais trabalhos para serem executados em paralelo ou está limitado a 2?
O servidor em que desejo configurar isso possui 5 bancos de dados de usuários. Se eu configurar tarefas paralelas para manutenção de índice
@databases='USER_DATABASES'
, duas das tarefas poderão executar a indexação no mesmo banco de dados simultaneamente? Por exemplo, o Trabalho 1 está trabalhando em um banco de dados grande com muitos índices altamente fragmentados, e o Trabalho 2 funciona nos outros 4 bancos de dados com bastante rapidez. Se o Trabalho 1 ainda estiver em execução, o Trabalho 2 terminará ou começará a funcionar no banco de dados em que o Trabalho 1 já está trabalhando?
Como alternativa, posso configurar trabalhos separados e, em vez de usá @databases='USER_DATABASES'
-los, especificarei em quais bancos de dados de usuário cada um deve realizar a manutenção do índice e não usar @DatabasesInParallel
.
Solução
Se você deseja realizar trabalhos do Ola em paralelo, deve tomar cuidado com algumas coisas. Não está muito claro na documentação.
master
, mas você usoumsdb
, certo? )@DatabasesInParallel
para cada etapa do trabalho que deseja executar em paralelo nos dois trabalhos.Você Terminou.
No entanto, a solução acima não leva em conta bancos de dados enormes e bancos de dados pequenos. Então você pode pensar que...
... para dividir os trabalhos entre um banco de dados enorme e alguns pequenos, você pode passar o parâmetro adicional
@Databases
em cada etapa do trabalho e adicionar o(s) nome(s) do banco de dados relevante(s).No entanto, isso anularia o propósito de ter vários trabalhos paralelos apenas trabalhando em uma lista de bancos de dados.
Em vez disso, solução
@Databases
nas duas etapas do trabalho e ...@Databases='HugeDatabase'
@Databases='USER_DATABASES,-HugeDatabase'
Basicamente, você está dizendo a um trabalho para executar a tarefa no enorme banco de dados e ao outro trabalho para executar as tarefas em todos os outros bancos de dados de usuários, exceto o
HugeDatabase
.Respondendo as suas perguntas
Desculpe, senti falta de responder às suas perguntas reais.
A solução simples foi explicada acima.
Eu nunca fiz isso sozinho. Eu construí apenas um trabalho adicional para processamento paralelo. No entanto, você poderá criar vários trabalhos conforme indicado na documentação:
As tabelas adicionais que precisam ser criadas, que mencionei na minha resposta inicial no início, tratam de como os trabalhos selecionam um banco de dados disponível. Um trabalho examinará a tabela e selecionará o primeiro banco de dados disponível e o marcará como sendo processado. O próximo trabalho examinará a mesma tabela e pegará o próximo banco de dados livre, que ainda não está sendo processado, marcando-o como sendo processado e assim por diante.
Não. Um trabalho ocupará um banco de dados e processará totalmente esse banco de dados. (veja a descrição na minha resposta à sua segunda pergunta)