Quais foram as causas dos últimos problemas de desempenho de SQL Server, que você enfrentou?
"Como podemos observar, os 2 problemas mais comuns são o código T-SQL e a indexação.
4 dos 6 problemas mais comuns estão todos diretamente relacionados ao T-SQL, índices, código,
e estrutura dos dados. Para obtermos melhorias em desempenho devemos olhar primeiro para área de acesso a dados, incluindo design de banco de dados, design de consulta, e design de índice.
Claro, se considerar a configuração de hardware e atualizações, podemos obter um ganho de desempenho satisfatório. No entanto, uma consulta SQL incorreta enviada pela aplicação pode consumir todos os recursos de hardware disponíveis, não importa o quanto recurso tenha."
Fonte: Grant Fritchey
Grafton, Massachusetts,
sexta-feira, 5 de julho de 2019
quinta-feira, 23 de maio de 2019
SQL Studio Management - Expanding Databases muito lento.
SQL Studio Management - Expanding Databases muito lento.
Em um de nossos clientes durante a implementação, identificamos uma situação atípica,uma performance muito lenta, abaixo do aceitável. Em atividades simples, apenas dentro do SQL Server Studio Management. Notamos que simples ações, como por exemplo de expandir o menu Databases.
Demorou em torno de 2 a 3 minutos, para exibir o nó de Bancos existentes.
Não me lembro exatamente quando começou. Mas eu acho que já fazem vários meses.
Era fácil demais ignorar, já que eu poderia usar o alt-tab e fazer outras atividades enquanto aguardava o atraso.
Hoje decidi pesquisá-lo e concluímos em duas opções:
Opção 1) Ocorre porque alguns bancos têm a opção de auto_close ativado;
Isso faz com que o servidor SQL tenha que inicializar cada banco de dados, antes de poder renderizá-lo no Nó menu de bancos. Isso cria um atraso muito significativo, quando você tem vários bancos de dados configurados para auto_close.
Uma maneira rápida de corrigir todos eles de uma só vez, quando possível ....
É configurar o modo de recuperação para = simple (qualquer coisa mais é inútil no ambiente de desenvolvimento), use este script:
Opção 2) Um configuração pré definida, do proprio SQL Studio gerou problemas não apenas em expandir databases. Mas em todas as ações executadas dentro do Management.
No Management Studio, no Menu (Tools)Ferramentas, selecione (Options) Opções e clique em "Designers". Há uma opção chamada "Override connection string time-out value for table designer updates:"
Valor de tempo limite, da cadeia de conexão para atualizações de designer de tabela:
Transaction time-out after: modifique para 0 seconds
Este segunda opção foi a mais eficiente em diversos clientes, principalmente em ambiente de produção.Quando não é possível modificações em modo de recuperação. Não há relação entre as opções mas foram alternativas funcionais.
Sugestões e explicações mais detalhadas estamos a disposição.
Fontes referencias: https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms190181(v=sql.105)
Em um de nossos clientes durante a implementação, identificamos uma situação atípica,uma performance muito lenta, abaixo do aceitável. Em atividades simples, apenas dentro do SQL Server Studio Management. Notamos que simples ações, como por exemplo de expandir o menu Databases.
Demorou em torno de 2 a 3 minutos, para exibir o nó de Bancos existentes.
Não me lembro exatamente quando começou. Mas eu acho que já fazem vários meses.
Era fácil demais ignorar, já que eu poderia usar o alt-tab e fazer outras atividades enquanto aguardava o atraso.
Hoje decidi pesquisá-lo e concluímos em duas opções:
Opção 1) Ocorre porque alguns bancos têm a opção de auto_close ativado;
Isso faz com que o servidor SQL tenha que inicializar cada banco de dados, antes de poder renderizá-lo no Nó menu de bancos. Isso cria um atraso muito significativo, quando você tem vários bancos de dados configurados para auto_close.
Uma maneira rápida de corrigir todos eles de uma só vez, quando possível ....
É configurar o modo de recuperação para = simple (qualquer coisa mais é inútil no ambiente de desenvolvimento), use este script:
USE MASTERDeclare@isql varchar(2000),@dbname varchar(64)declare c1 cursor for select name from master..sysdatabases where name not in ('master','model','msdb','tempdb')open c1fetch next from c1 into @dbnameWhile @@fetch_status <> -1beginselect @isql = 'ALTER DATABASE @dbname SET AUTO_CLOSE OFF'select @isql = replace(@isql,'@dbname',@dbname)print @isqlexec(@isql)select @isql = 'ALTER DATABASE @dbname SET RECOVERY SIMPLE'select @isql = replace(@isql,'@dbname',@dbname)print @isqlexec(@isql)select @isql='USE @dbname checkpoint'select @isql = replace(@isql,'@dbname',@dbname)print @isqlexec(@isql)fetch next from c1 into @dbnameendclose c1deallocate c1
Opção 2) Um configuração pré definida, do proprio SQL Studio gerou problemas não apenas em expandir databases. Mas em todas as ações executadas dentro do Management.
No Management Studio, no Menu (Tools)Ferramentas, selecione (Options) Opções e clique em "Designers". Há uma opção chamada "Override connection string time-out value for table designer updates:"
Valor de tempo limite, da cadeia de conexão para atualizações de designer de tabela:
Transaction time-out after: modifique para 0 seconds
Este segunda opção foi a mais eficiente em diversos clientes, principalmente em ambiente de produção.Quando não é possível modificações em modo de recuperação. Não há relação entre as opções mas foram alternativas funcionais.
Sugestões e explicações mais detalhadas estamos a disposição.
Fontes referencias: https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms190181(v=sql.105)
segunda-feira, 8 de abril de 2019
CHECKDB rodando a cada minuto? SQL-Server
Dias atrás eu me deparei com uma pergunta nos fóruns onde o usuário estava recebendo essa mensagem no log de erro do SQL Server a cada minuto.
Ele não agendou o CHECKDB para rodar a cada minuto e queria saber o que significa esta mensagem? Uma rápida olhada na mensagem informativa indica claramente que o SQL Server não está reportando os resultados do DBCC CHECKDB . Essa mensagem é relatada no log de erros sempre que um banco de dados é iniciado. Este é um recurso adicionado no antigo SQL Server 2005 em diante. Na terceira linha na mensagem acima confirma que o banco de dados está realmente iniciando a cada minuto.
CHECKDB for database 'DBName' finished without errors on [date and time]. This is an informational message only; no user action is required. Starting up database 'DBName'
Por que o banco de dados é iniciado a cada minuto?
Isso ocorre porque a propriedade AutoClose para esse banco de dados é definida como True .
Com essa propriedade definida como True , quando a última conexão do usuário é desconectada, o banco de dados é fechado. Quando um usuário se conecta de volta ao banco de dados, o banco de dados é iniciado novamente e a mensagem informativa é registrada no Log de Erros do SQL Server. Quando um banco de dados é inicializado, os recursos são atribuídos a ele e, quando ele é fechado, os recursos são liberados. A opção AutoClose é útil em um banco de dados que não é usado com frequência, como em um banco de dados em execução no SQL Server Express Edition. Mas se essa propriedade estiver configurada como True em um banco de dados OLTP ocupado, isso terá um impacto negativo no desempenho da instância.
Até mesmo eu encontrei alguns bancos de dados no ambiente do meu cliente onde a propriedade AutoClose estava definida como True . Como esses bancos de dados eram pequenos em tamanho e não tinham muita importância, não houve impacto. Essa propriedade pode ser desativada usando o diálogo Propriedades do Banco de Dados no SSMS ou usando a consulta a seguir.
ALTER DATABASE [DBName] SET AUTO_CLOSE OFF
terça-feira, 26 de março de 2019
SQL SERVER (SP_WHO2) - Entenda a diferença entre status Running, Pending, Runnable, Suspended, Sleeping ...
SQL SERVER (SP_WHO2) - Entenda a diferença entre status, pendente, executável, suspenso, suspenso.
Uma das perguntas mais populares que recebo durante o dia-a-dia no cotidiano, principalmente dos desenvolvedores é, qual a diferença entre os status em sp_who2. Hoje vamos entendê-los e detalhar no que diz respeito à CPU e I/O.
Primeiro, vamos ver a definição:
Em Execução (Running) - A sessão com este status está realmente executando os batches e consumindo os ciclos da CPU.
Runnable - A sessão com este status é, na verdade, atribuída a um thread, mas espera que o ciclo da CPU esteja disponível.
Pendente (Pending) - A sessão com este status ainda não foi atribuída a um threads e está aguardando a disponibilidade dos threads.
Suspenso (Suspended) - A sessão com esse status geralmente está aguardando a disponibilidade dos recursos. Eu já vi isso com mais conclusão de operação de E / S sobre problemas de CPU.
Dormir (Sleeping) - A sessão com esse status não está realmente fazendo nada. Muitas vezes vejo esse status quando todas as tarefas relacionadas aos threads são concluídas, mas a conexão ainda está aberta. (Você pode abrir uma nova conexão no SQL Server Management Studio e não executar nada lá. Em seguida, verifique o status do SPID e você notará que o status está em Suspensão). Então, desta vez, quando você executar sp_who2, você saberá rapidamente o que cada thread significa.
Então, da próxima vez, quando executar sp_who2, saberá rapidamente o que cada thread significa.
Uma das perguntas mais populares que recebo durante o dia-a-dia no cotidiano, principalmente dos desenvolvedores é, qual a diferença entre os status em sp_who2. Hoje vamos entendê-los e detalhar no que diz respeito à CPU e I/O.
Primeiro, vamos ver a definição:
Em Execução (Running) - A sessão com este status está realmente executando os batches e consumindo os ciclos da CPU.
Runnable - A sessão com este status é, na verdade, atribuída a um thread, mas espera que o ciclo da CPU esteja disponível.
Pendente (Pending) - A sessão com este status ainda não foi atribuída a um threads e está aguardando a disponibilidade dos threads.
Suspenso (Suspended) - A sessão com esse status geralmente está aguardando a disponibilidade dos recursos. Eu já vi isso com mais conclusão de operação de E / S sobre problemas de CPU.
Dormir (Sleeping) - A sessão com esse status não está realmente fazendo nada. Muitas vezes vejo esse status quando todas as tarefas relacionadas aos threads são concluídas, mas a conexão ainda está aberta. (Você pode abrir uma nova conexão no SQL Server Management Studio e não executar nada lá. Em seguida, verifique o status do SPID e você notará que o status está em Suspensão). Então, desta vez, quando você executar sp_who2, você saberá rapidamente o que cada thread significa.
Então, da próxima vez, quando executar sp_who2, saberá rapidamente o que cada thread significa.
sexta-feira, 22 de fevereiro de 2019
Confira as últimas atualizações disponíveis para cada versão do SQL Server
Últimas atualizações disponíveis para as versões atualmente suportadas do SQL Server.
Observação
Observação
Agora a versão prévia do SQL Server 2019 está disponível. Para obter mais informações, consulte Novidades no SQL Server 2019.
| Versão | Pacote de serviços mais recente | acumulativas |
|---|
| SQL Server 2017 | None | CU13 para 2017(14.0.3048.4 – dezembro de 2018) | Compilações de SQL Server 2017 |
| SQL Server 2016 | SQL Server 2016 SP2 (13.0.5026.0 – abril de 2018) |
CU5 para 2016 SP2(13.0.5264.1 – janeiro de 2019)
CU13 para 2016 SP1(13.0.4550.1 – janeiro de 2019) CU9 para 2016 RTM (13.0.2216.0 – novembro de 2017) | Compilações de SQL Server 2016 |
| SQL Server 2014 | SQL Server 2014 SP3 (12.0.6024.0 – outubro de 2018) |
CU2 de 2014 SP3(12.0.6214.1– fevereiro de 2019)
CU16 de 2014 SP2 (12.0.5626.1– fevereiro 2019)
CU13 de 2014 SP1 (12.0.4522.0 – agosto de 2017)
| Compilações de SQL Server 2014 |
| SQL Server 2012 | SQL Server 2012 SP4(11.0.7001.0 – setembro de 2017) | CU10 para SP3 2012 (11.0.6607.3 – agosto de 2017) CU16 para o SP2 de 2012 (11.0.5678.0 – janeiro de 2017) CU16 de 2012 SP1(11.0.3487.0 - maio de 2015) | Compilações de SQL Server 2012 |
| SQL Server 2008 R2 | SP3 do SQL Server 2008 R2(10.50.6000.34 – setembro de 2014)Observação: Versão final e mais recente para esta versão | None | Compilações do SQL Server 2008 R2 |
| SQL Server 2008 | SQL Server 2008 SP4(10.0.6000.29 – setembro de 2014)Observação: Versão final e mais recente para esta versão | None | Compilações do SQL Server 2008 |
| SQL Server 2005 | SQL Server 2005 SP4(9.00.5000.00 – dezembro de 2010) | None | Compilações de SQL Server 2005 |
quinta-feira, 24 de janeiro de 2019
SQL SERVER – Clear Cache plan, para um único banco de dados.
Durante a nossa analise do desempenho do banco de dados, implementamos algumas melhorias mais complexas que, chegamos ao ponto em que precisávamos reiniciar o cache do servidor, para analisar como nossas alterações seriam aplicadas e seu comportamento.
Enquanto estávamos discutindo sobre reiniciar ou não os servidores, o desenvolvedor da organização, imediatamente correu para o Management Studio (SSMS) e escreveu o seguinte comando.
1
| DBCC FREEPROCCACHE --não execute isso rs ... |
Neste momento solicitamos para parar imediatamente, e explicamos que se ele executasse o comando acima no servidor, ele descartaria o cache do plano para TODOS o banco de dados no servidor e isso é algo não recomendado. Se o cache for descartado para todo o servidor, durante o horário comercial, o SQL Server estará sob pressão para recriar todos os planos e também poderá afetar negativamente o desempenho. Como havíamos feito melhorias em um único banco de dados e nossa necessidade era limpar o cache para um único banco de dados não seria necessário reiniciar completamente todo o cache, portanto, executamos pontualmente para remover os planos em cache para um único banco de dados.
1
2
3
| DECLARE @dbid INT = DB_ID(); |
Se vocês estiverem usando o SQL Server 2016 ou versão superior (uaaaaaAAAAAAalll rs), também poderá executar o seguinte comando:
1
2
| ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE |
Bem, é isso. É muito simples remover o cache de um único banco de dados, sugiro fortemente que você o faça apenas nas condições extremas, pois na maioria dos casos, você não precisa dele. E podem causar problemas de performance pontual de acordo com a disponibilidade e performance desta base.
Assinar:
Postagens (Atom)





