Ir para o conteúdo

Depuração e Aprimoramento de Desempenho de Vinyl

Ferramentas para Desenvolvedores do Chrome

Chrome DevTools é um conjunto de ferramentas para desenvolvedor web integradas diretamente no navegador Google Chrome. Usando o DevTools do Chrome, você pode diagnosticar problemas no Vinyl com solicitações que não estão sendo respondidas ou tratadas corretamente, gravar um arquivo HAR usado para solução de problemas adicionais e ajudar a identificar problemas com o tempo de carregamento da página.

O Chrome DevTools também fornece ferramentas para você capturar capturas de tela, emular a experiência de um usuário móvel e analisar solicitações feitas pela página durante o carregamento para identificar áreas específicas que afetam o tempo de carregamento da página.

Nota

Para baixar o Google Chrome: https://www.google.com/chrome/

Identificando Códigos de Erro HTTP com o Chrome

O Chrome DevTools permite visualizar e filtrar rapidamente códigos de erro HTTP para ajudar a isolar e identificar um erro com uma solicitação de aplicativo Vinyl que não está sendo respondida ou tratada corretamente. Os códigos de status de resposta HTTP indicam se uma solicitação HTTP específica foi concluída com êxito.

Na aba Rede do Chrome DevTools, você pode filtrar rapidamente as informações resultantes clicando nos cabeçalhos das colunas. Aqui você pode clicar em Status para visualizar os resultados do código HTTP e identificar quaisquer tarefas que não estejam retornando um resultado 200 OK.

Guia rede do Chrome

No exemplo de captura de tela, na aba Rede do Chrome DevTools, vemos que a página do aplicativo está exibindo mensagens de erro 500 Internal Server Error e 504 Gateway Timeout. As informações contidas na coluna Nome deste resultado ajudam a definir onde no Vinyl este erro está sendo iniciado.

Aqui está uma lista dos resultados de códigos de erro HTTP mais comuns:

  • 301 mudou-se permanentemente
  • 302 Encontrado
  • 307 Redirecionamento temporário
  • 308 Redirecionamento permanente
  • 400 Solicitação incorreta = Erro do cliente
  • 401 Não autorizado = Erro do cliente
  • 403 Proibido = Erro do Cliente
  • 404 Não Encontrado = Erro do Cliente
  • Método 405 não permitido = Erro do cliente
  • 500 Erro interno do servidor = Erro do servidor
  • 502 Gateway inválido = erro do servidor
  • 503 Serviço indisponível = erro do servidor
  • 504 Tempo limite do gateway = erro do servidor

Nota

Para obter mais códigos de erro HTTP, consulte: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status

Gerando um Arquivo HAR com o Chrome

Ao solucionar problemas complexos do Vinyl, ter um arquivo HAR gravado e gerado a partir das ferramentas do Chrome Web Developer pode ser útil e/ou solicitado por um desenvolvedor do Vinyl para diagnosticar e resolver problemas adicionais. Um arquivo HAR captura um log de solicitações e atividades de rede no momento em que o problema em questão está acontecendo. Especificamente, um HAR é um formato de arquivo compactado em JSON para registrar a interação de um navegador da web com um site.

Para Gerar um Arquivo HAR:

  1. Abra o Google Chrome e vá para a página do Vinyl onde o problema está acontecendo
  2. Na barra de menu do Chrome, selecione Visualizar > Desenvolvedor > Ferramentas do desenvolvedor
  3. No painel aberto na parte inferior da tela, selecione a aba Rede
  4. Procure um botão redondo vermelho Gravar no canto superior esquerdo da aba Rede e certifique-se de que esteja vermelho. Se estiver cinza, clique nele uma vez para iniciar a gravação.
  5. Marque a caixa ao lado de Preservar log
  6. Clique no botão Limpar para limpar todos os registros existentes na aba Rede
  7. Agora tente reproduzir o problema que você estava enfrentando antes, enquanto as solicitações de rede estão sendo gravadas

    Har

  8. Depois de reproduzir o problema, clique com o botão direito na grade de solicitações de rede, selecione Salvar como HAR com conteúdo e salve o arquivo em seu computador

Para obter mais informações: consulte "Primeiros passos para analisar o desempenho da rede no Chrome DevTools" https://developers.google.com/web/tools/chrome-devtools/network-performance/

Identificando Problemas de Desempenho com o Chrome

As ferramentas Chrome DevTools podem ajudar a identificar problemas de desempenho em seu aplicativo Vinyl. Se você navegar primeiro até a página onde está enfrentando um problema de desempenho, poderá abrir o DevTools e dar uma olhada na aba Rede e classificar na coluna Tempo. Classifique para poder ver quais solicitações estão demorando mais. As colunas Nome e Iniciador correspondentes fornecem informações adicionais sobre a solicitação originada do aplicativo Vinyl.

Observe que se nos resultados da aba Rede você descobrir que as solicitações denominadas filter? estão ocupando a maior parte do tempo de carregamento da página, isso indica que você provavelmente precisará otimizar o Business Object correspondente.

Business Objects (ou Data Objects) podem ser uma fonte de tempos lentos de carregamento de página. Se você identificar que uma solicitação de execução mais longa se origina de um Objeto de Negócios, consulte a próxima seção que descreve os motivos pelos quais um Objeto de Dados é lento e opções para melhorar a velocidade.

Razões pelas Quais um Objeto de Negócio é Lento e Opções para Melhorar a Velocidade

Dependendo da forma como são configurados, os Business Objects (também chamados de Data Objects) podem ser a causa de problemas de desempenho ou lentidão no aplicativo Vinyl. Os motivos específicos pelos quais um Business Object pode ser lento incluem:

  • A lógica SQL contém muitas subconsultas
  • Colunas desnecessárias são usadas na lógica
  • Onde as cláusulas não usam declarações amigáveis ao índice
  • Os índices não são definidos em tabelas que um objeto de dados está usando
  • Índices redundantes em tabelas sendo referenciadas pela lógica SQL
  • Juntando-se em colunas calculadas
  • O uso do índice pode ser perdido devido à lógica em execução nas funções
  • O campo Binário é incluído quando o campo Binário não está sendo utilizado por um Painel
    • Incluir campo(s) binário(s) apenas em Business Objects se for usado como controle de arquivo
    • Vale a pena criar Business Objects especificamente para usar em Painéis onde um arquivo é carregado/baixado
  • Todas as colunas em um Business Object serão carregadas pelo Vinyl nas seguintes condições:
    • Existe formatação condicional
    • Se um campo tiver a Substituição de Suporte habilitada
    • Se um painel tiver alguma regra de visibilidade não estática

Os Business Objects ainda podem causar tempos de carregamento lentos nas páginas do aplicativo, mesmo que os 'Resultados' resultantes do Business Object sejam carregados rapidamente. Verifique se há coisas na página do seu aplicativo que afetam a velocidade, como classificação, caixas de listagem ou outras configurações da camada da interface do usuário que podem causar tempos de carregamento de página mais lentos.

Achatando Consultas SQL

Se você identificou que um objeto de negócios específico está causando problemas de desempenho, pode haver uma oportunidade de melhorar a lógica SQL e potencialmente nivelar a consultar.

  • Na maioria das vezes você deve reutilizar subconsultas
  • Às vezes, uma consultar pode se tornar tão grande com subconsultas aninhadas que fica lenta – só então ela deve ser revisada e reescrita
  • Achatar a consultar (removendo subconsultas desnecessárias) geralmente melhora o desempenho
  • Pode examinar o plano de execução e índices

Removendo Colunas Não Utilizadas

Muitas vezes, consultas com problemas de desempenho usam colunas desnecessárias na lógica SQL.

  • Frequentemente descobrimos que consultas com problemas de desempenho possuem subconsultas que selecionam muito mais dados do que os usados pela consultar externa
  • A remoção dessas colunas (principalmente as colunas calculadas) melhorará o desempenho
  • Use a regra de cópia e comece a fazer alterações
  • Cronometre quanto tempo os "Resultados" levam para retornar. Cronometre também quanto tempo retornará "Carregar mais linhas".

Declarações Amigáveis de Indexação em Cláusulas Where

A cláusula Where define a condição de pesquisa de uma instrução SQL e, portanto, cai no domínio funcional central de um índice: encontrar dados rapidamente. Uma cláusula Where mal escrita costuma ser a culpada em uma consultar SQL de execução lenta. Uma cláusula Where deve ser eficiente e incluir os índices corretos.

Ruim (índices não serão usados):

  • Onde LOWER(FirstName) como '%Bob%
  • Onde AGORA() > DATEADD(minutos,60,StartTime)

Bom (índices usados):

  • Onde FirstName como 'Bob%'
  • Onde DateAdd(minutos,-60,NOW()) > StartTime

O SQL Server possui modo de rastreamento e utilitários de plano de consultar que você pode executar para verificar se os índices estão sendo usados.

Configurações de Vinyl para Melhorar o Desempenho

Esta seção ilustrará as configurações do Vinyl que afetam o desempenho. Evite pesquisar/filtrar/classificar em colunas em tabelas grandes que não estão indexadas – quando consultas lentas são detectadas e os índices não são uma opção.

No nível do painel, ativar o Download de suporte e ter a pesquisa simples ativada e configurada como somente indexado pode ajudar a melhorar o desempenho.

Nota

Ao pesquisar campos indexados, o Vinyl gera consultas amigáveis ao índice:

…FirstName like 'Bob%'…
Will match: "Bob Smith"
Will not match: "Mr Bobert"

Índices e o Que Deve Ser Indexado

No SQL, um índice é usado para acelerar o desempenho das consultas, ajudando a buscar seus dados com mais rapidez no SQL Server. Isto é conseguido reduzindo o número de páginas de dados do banco de dados que precisam ser visitadas/verificadas. Ao pensar em índices em Vinyl Data Objects, você precisa de índices suficientes para acelerar suas consultas SELECT e, ao mesmo tempo, não deve criar índices redundantes que possam potencialmente retardar suas operações UPDATE/DELETE.

As arquiteturas de índice são classificadas como agrupadas ou não agrupadas. Índices clusterizados são índices cuja ordem das linhas nas páginas de dados corresponde à ordem das linhas no índice. É por isso que apenas um índice clusterizado pode existir em uma determinada tabela, enquanto muitos índices não clusterizados podem existir na tabela.

No Vinyl, os índices são criados em objetos Tabela. De modo geral, toda tabela deve ter um índice clusterizado para permitir uma pesquisa eficiente dos dados dessa tabela. Quando falta um valor de índice em uma tabela, isso pode contribuir para diminuir a velocidade do aplicativo. Certifique-se de que a chave primária de cada tabela e quaisquer colunas de chave exclusivas existentes estejam indexadas. Ao considerar a modificação de índices no Vinyl, tenha em mente os seguintes pontos-chave:

  • Você deseja equilibrar a criação de índices com o impacto no desempenho que causará nas instruções de inserção/atualização. Adicionar índices acelerará as consultas, mas retardará a inserção/atualização/exclusão.
  • Você também precisa considerar a indexação das colunas usadas para ordenar e aquelas usadas em uma expressão de agrupamento. Você pode se beneficiar da indexação das colunas que as funções MIN(), MAX(), COUNT(), SUM() e AVG() usam para agregar os dados
  • Você pode aproveitar a "cobertura de índices", onde você tem um índice maior que pode ser aproveitado por consultas que usam subconjuntos de colunas.
    • A ordem das colunas no índice é importante
    • A recomendação é que as colunas de desigualdade venham depois das colunas de igualdade em seus índices de cobertura

Ferramentas de Índice Ausentes

Existem utilitários e consultas do SQL Server que podem ser aproveitados para ajudar no processo de revisão de índices. DMVs (exibições de gerenciamento dinâmico) são utilitários do SQL Server que retornam informações de estado do servidor e podem ser usados para monitorar a integridade do servidor de banco de dados e diagnosticar problemas. Os DMVs fornecem ótimas informações sobre o que está acontecendo no SQL Server. A execução deles requer permissão VIEW DATABASE STATE no banco de dados em questão.

Você pode identificar índices ausentes em suas consultas SQL principalmente de três maneiras -

  • Executando o Orientador de Otimização do Mecanismo de Banco de Dados
  • Execução de visualizações de gerenciamento dinâmico de índice ausente
  • O SQL Server Engine solicita índices ausentes quando você gera planos de execução no SSMS

A seguir estão três consultas SQL frequentemente usadas para ajudar a identificar problemas com índices:

FindingLongRunningQueries.sql
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT TOP 20
CAST(qs.total_elapsed_time / 1000000.0 AS DECIMAL(28, 2))
AS [Total Duration (s)]
, CAST(qs.total_worker_time * 100.0 / qs.total_elapsed_time
AS DECIMAL(28, 2)) AS [% CPU]
, CAST((qs.total_elapsed_time - qs.total_worker_time)* 100.0 /
qs.total_elapsed_time AS DECIMAL(28, 2)) AS [% Waiting]
, qs.execution_count
, CAST(qs.total_elapsed_time / 1000000.0 / qs.execution_count
AS DECIMAL(28, 2)) AS [Average Duration (s)]
, SUBSTRING (qt.text,(qs.statement_start_offset/2) + 1,
((CASE WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2) + 1) AS [Individual Query]
, qt.text AS [Parent Query]
, DB_NAME(qt.dbid) AS DatabaseName
, qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
WHERE qs.total_elapsed_time > 0
ORDER BY qs.total_elapsed_time DESC
IdentifyMostImportantMissingIndexes.sql
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT TOP 20
    ROUND(s.avg_total_user_cost *s.avg_user_impact*  (s.user_seeks + s.user_scans),0) AS [Total Cost]
 , d.[statement] AS [Table Name]
 , equality_columns
 , inequality_columns
 , included_columns
FROM sys.dm_db_missing_index_groups g
    INNER JOIN sys.dm_db_missing_index_group_stats s
        ON s.group_handle = g.index_group_handle
    INNER JOIN sys.dm_db_missing_index_details d
        ON d.index_handle = g.index_handle
WHERE d.database_ID = DB_ID()
ORDER BY [Custo total] DESC
IdentityUnusedIndexes.sql
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
    DB_NAME() AS DatabaseName
 , SCHEMA_NAME(o.Schema_ID) AS SchemaName
 , OBJECT_NAME(s.[object_id]) AS TableName
 , i.name AS IndexName
 , s.user_updates
 , s.system_seeks + s.system_scans + s.system_lookups AS [System usage]
INTO    #TempUnusedIndexes
FROM    sys.dm_db_index_usage_stats s
    INNER JOIN sys.indexes i 
        ON s.[object_id] = i.[object_id]
        AND s.index_id   = i.index_id
    INNER JOIN sys.objects o 
        ON i.object_id   = O.object_id
WHERE     1=2

EXEC sp_MSForEachDB 'USE [?];
INSERT INTO #TempUnusedIndexes
SELECT TOP 20
    DB_NAME() AS DatabaseName
 , SCHEMA_NAME(o.Schema_ID) AS SchemaName
 , OBJECT_NAME(s.[object_id]) AS TableName
 , i.name AS IndexName
 , s.user_updates
 , s.system_seeks + s.system_scans + s.system_lookups
    AS [System usage]
FROM    sys.dm_db_index_usage_stats s
    INNER JOIN sys.indexes i 
        ON s.[object_id] = i.[object_id]
        AND s.index_id = i.index_id
    INNER JOIN sys.objects o ON i.object_id = O.object_id
WHERE     s.database_id = DB_ID()
AND     OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0
AND     s.user_seeks = 0
AND     s.user_scans = 0
AND     s.user_lookups = 0
AND     i.name IS NOT NULL
ORDER BY s.user_updates DESC'

SELECT     TOP 20 * 
FROM     #TempUnusedIndexes 
ORDER BY [atualizações_do_usuário] DESC
DROP TABLE #TempUnusedIndexes

Usando Instrução SQL de Logs e Otimizador de Índice

Depois de identificar um Business Object que apresenta problemas de desempenho, você pode recuperar a lógica da instrução SQL dos logs do Vinyl e executá-la por meio de um utilitário otimizador de índice para identificar áreas de melhoria. Isto pode resultar na identificação de índices a serem adicionados, por exemplo.

Para recuperar a lógica da instrução SQL, navegue no aplicativo até a página onde o Business Object está sendo usado. Daqui:

  1. Acesse IDE > Monitoramento
  2. Clique em Logs de banco de dados no menu
  3. Clique no botão Editar configuração
  4. Clique em Editar
  5. Na seção Configuração do log de memória, defina Gravidade mínima como Trace.

    Importante

    Sempre redefina o valor de Gravidade Mínima de volta para Desligado quando terminar de capturar informações de log.

  6. Clique no botão Salvar

  7. Agora você deve estar visualizando a tela Fast Logs no Vinyl, que consiste em 500 linhas de dados de log (a menos que você modifique esse valor de 500). Percorra os dados de log até localizar a lógica da instrução SQL que você está procurando.
  8. Copie toda a lógica da instrução SQL, começando com SELECT. Por exemplo:

    Sql

  9. Clique no botão Editar configuração

  10. Clique em Editar na tela Configuração de Log
  11. Na seção Configuração do log de memória, defina Gravidade mínima como Desligado
  12. Inicie o SQL Server Management Studio
  13. Conecte-se à sua conexão de banco de dados
  14. Existem alguns caminhos diferentes que você aproveita no SQL Server Management Studio para otimizar melhor parte da lógica de instrução SQL que seu aplicativo está usando
  15. Você pode clicar no botão Nova consulta e definir o banco de dados disponível para o banco de dados correspondente ao aplicativo que você está analisando
  16. Insira a seguinte sintaxe de consultar, que é uma consultar para encontrar as 10 principais consultas SQL que usam mais recursos (leituras, gravações, tempo de trabalho (CPU), etc.):

    Selecionar top 10

  17. Clique no botão Executar

  18. Os resultados exibirão as 10 principais consultas SQL que estão demorando mais para retornar informações em seu aplicativo. Observe que a segunda entrada em nossa captura de tela de exemplo retorna a mesma consultar que identificamos acima (SELECT TOP 2…).

    10 principais resultados

  19. Clique no botão Nova Consulta na barra de ferramentas

  20. Insira a lógica da instrução SQL que você copiou dos logs do Vinyl
  21. Selecione o banco de dados correspondente no menu de seleção do banco de dados disponível

    Sqlquery

  22. Se você estiver usando o banco de dados SQL Server (o SQL Express não suporta isso), você pode clicar com o botão direito do mouse dentro do painel SQL Query e selecionar Analisar Consulta no Orientador de Otimização do Mecanismo de Banco de Dados. Aqui você também pode aproveitar o utilitário de plano de execução, que mapeará a viagem que a instrução SQL faz pelo banco de dados do aplicativo e ajudará a identificar áreas que podem estar demorando muito para serem ajustadas.

O ajuste de banco de dados é um conjunto de habilidades técnicas e complexas, requer as permissões corretas para acessar e visualizar bancos de dados e deve ser feito de forma metódica, cuidadosa e com testes rigorosos realizados durante todo o processo para garantir que o resultado líquido seja positivo.

Recursos

  • Ajuste de desempenho de consulta (SQL Server Compact): https://technet.microsoft.com/en-us/library/ms172984(v=sql.110).aspx.aspx)
  • SQL Server 2017 - "Visualizações e funções de gerenciamento dinâmico relacionadas ao índice (Transact-SQL)" da Microsoft: https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/index-related-dynamic-management-views-and-functions-transact-sql?view=sql-server-2017