DBCC FREEPROCCACHE
não funciona no banco de dados SQL do Azure. De que outra forma eu posso forçar um plano a sair do cache de uma maneira que não prejudique o sistema de produção (ou seja, não posso simplesmente alterar as tabelas de maneira indesejada)? Isso é especificamente para SQL criado pelo Entity Framework, portanto, esses não são procs armazenados autogerenciados - é efetivamente um SQL dinâmico.
(A fonte apresentava índices ruins -> estatísticas ruins, etc. Isso tudo foi corrigido, mas um plano ruim não vai acabar.)
ATUALIZAÇÃO: Selecionei a solução de @ mrdenny quando ele chegou lá primeiro. No entanto, estou usando com êxito o script de @Aaron Bertrand para executar o trabalho. Obrigado a todos pela ajuda !!
sql-server
execution-plan
azure-sql-database
Jaxidian
fonte
fonte
sp_executesql
.Respostas:
O SQL do Azure agora suporta diretamente isso
O Banco de Dados SQL do Azure suporta diretamente a limpeza do cache de proc do banco de dados do usuário atual sem nenhum hacks:
informação adicional
O script a seguir (de Shannon Gowen ) pode ser usado para assistir o processo passo a passo:
fonte
Atualmente, não há uma maneira explícita de fazer isso, mas esse não é um cenário permanente (o comando DBCC ainda não é suportado, mas leia no Query Store ). Mesmo quando a ocorrência de alteração de esquema é aceitável, pode não ser o que você deseja, porque invalidará todos os planos relacionados ao objeto subjacente, não apenas o ruim.
Não é necessário crédito para isso, mas é muito fácil criar SQL dinâmico para executar a mesma operação em várias tabelas:
(Eu escrevi uma dica sobre esse problema "comprimento do SQL dinâmico" ...)
fonte
nvarchar(max)
variável atinge um limite após 4000 caracteres, 8000 caracteres se eu mudar paravarchar(max)
. Executando esse script exato. Temos ~ 450 mesas, por isso atingimos com facilidade (~ 30/60 mesas).varchar(max)
é uma sintaxe válida, é idênticavarchar(8000)
envarchar(max)
é idêntica anvarchar(4000)
.PRINT
comanda, ele mostra apenas 8000 bytes. Essa é uma limitação doPRINT
comando, não do Azure. Se você executar o comando, ele funcionará mesmo que você não possa inspecionar visualmente a coisa toda.Adicione uma coluna anulável à tabela e solte a coluna. Isso forçará o SQL a liberar o cache para esse objeto.
Quanto a fazer todas as tabelas, um cursor deve fazer o truque. Basta usar um nome de coluna que nunca existirá em nenhuma tabela como 'zzzzzz_go_away' ou algo assim.
fonte
O Banco de Dados SQL do Azure atualmente não oferece suporte
DBCC FREEPROCCACHE
, portanto você não pode remover manualmente um plano de execução do cache. No entanto, se você fizer alterações em uma tabela ou exibição referenciada pela consulta (ALTER TABLE
/ALTER VIEW
), o plano será removido do cache. ( Referência .)fonte
Para limpar todo o plano de execução, use o seguinte:
Se você alterar uma tabela ou exibir uma referência a ela, o plano de execução será limpo.
Um pouco mais explicado aqui http://christianarg.wordpress.com/2013/08/22/remove-execution-plans-from-the-procedure-cache-in-sql-azure/
fonte