É possível dar ao otimizador mais ou todo o tempo necessário?

18

Dado que o otimizador não pode levar o tempo necessário (ele precisa minimizar o tempo de execução e não contribuir com ele) para explorar todos os possíveis planos de execução que às vezes são cortados.

Eu queria saber se isso pode ser substituído, para que você possa dar ao otimizador o tempo todo em necessidades (ou uma certa quantidade de milissegundos).

Não preciso disso (atm), mas posso imaginar um cenário em que uma consulta complexa é executada em um loop restrito e você deseja criar o plano ideal e armazená-lo em cache antes.

Claro que você tem um loop apertado, você deve reescrever a consulta para que ela desapareça, mas aceite comigo.

Isso é mais uma questão de curiosidade e também para ver se às vezes há uma diferença entre uma otimização em curto-circuito e uma otimização completa.

Acontece que você pode dar mais tempo ao otimizador com o sinalizador de rastreamento 2301. Não é exatamente o que eu estava perguntando, mas chega perto.

As melhores informações que encontrei sobre isso estão em Query Processor Modeling Extensions no SQL Server 2005 SP1 por Ian Jose.

Use este sinalizador de rastreamento com cuidado! Mas isso pode ser útil ao apresentar melhores planos. Veja também:

Eu estava pensando em consultas com muitas junções em que o espaço da solução para a ordem de junção explode exponencialmente. As heurísticas usadas pelo SQL Server são muito boas, mas eu queria saber se o otimizador proporia uma ordem diferente se tivesse mais tempo (no intervalo de segundos ou até minutos).

Buckley
fonte

Respostas:

16

Ao lado do sinalizador 2301, existe o 8780, que realmente faz com que o otimizador 'trabalhe mais', pois apenas oferece mais tempo (não ilimitado, conforme descrito em detalhes aqui (russo) e menos detalhado aqui ) para fazer o seu trabalho.

Descrição detalhada em inglês do autor original do artigo em russo. que inclui o aviso do próprio autor:

não é recomendável usá-lo na produção .

Combinando os dois e aplicando-os (de maneira muito seletiva via dica de consulta OPTION (QUERYTRACEON 2301, QUERYTRACEON 8780) a uma consulta de TVFs embutidos e aninhados em quatro níveis (onde apenas o da parte inferior faria qualquer trabalho real e os níveis superiores correlacionariam resultados) via subconsultas EXISTS) resultou em uma boa MERGE JOIN e em várias LAZY SPOOLs que reduziram o tempo de execução pela metade.

ENOTTY
fonte
4

Não, você não pode.

Você pode fazer suas consultas "otimizadas", entendendo como funciona (animal complexo, não é necessário conhecê-lo de dentro para fora). Eu sugiro que, se você fizer algo tão crítico, corrija a consulta em vez de alterar a maneira como o SQL Server opera.

Por exemplo, você gostaria de saber quando uma consulta começa a ser dimensionada com menos eficiência que O (n) à medida que o volume de dados + a distribuição de dados são alterados: dar mais tempo ao otimizador não agrega valor aqui.

gbn
fonte