Base de Conhecimento

Cross Segmentos - Backoffice RM - BI - Alerta de Consultas SQL's lentas no RM


time.png 
Tempo aproximado para leitura: 00:04:00 min

 

Dúvida
Qual procedimento devo realizar ao ser apresentado alerta de mensagens de consultas SQLs lentas no RM?

Ambiente
Cross Segmentos - TOTVS Backoffice (Linha RM) - RM BI - A partir da 12.1.23

Solução

Através do TOTVS News (módulo de globais) e da visão na tela de cadastro das consultas  SQL do RM, os usuários que são supervisores do módulo de globais serão notificados sobre as consultas SQL lentas que possuem em seu ambiente.

Esta informação é coletada através do  Snowden e importada para serem exibidas as notificações. Ao acessar as notificações os usuários têm a possibilidade de visualizar os detalhes de cada consulta SQL lenta e assim tomar a decisão de corrigi-la, adotando as melhores práticas de construção, também poderá deixar para analisar em um segundo momento ou se preferir poderá escolher ignorar.

Exemplo de como serão exibidas as informações:

image2022-6-28_13-50-27.png

Caso escolha na tela de notificações para ignorar uma consulta SQL lenta ou todas as consultas SQL lentas, as mesmas não irão mais aparecer na tela de notificação, mas não quer dizer que as lentidões foram corrigidas. Portanto, aconselhamos marcar esta opção somente após analisar a consulta e modificá-la para ficar mais performática. Desta forma seu sistema ficará mais rápido!

Para não trazer informações pontuais, que podem ser impactadas por algum item específico no ambiente, só serão demonstradas consultas que tiverem mais de 10 recorrências no período de 3 meses. 

Para localizar a consulta SQL ofensora em sua base de dados siga os passos abaixo.

Copie parte da sintaxe e utilize na busca dentro do SGBD ou menu SQL da MDI para identificar o código (desta forma é possível rastrear o uso):

SGBD:


MDI:



Após identificar o código, é possível rastrear onde ela é utilizada:

 



Abaixo, elencamos boas práticas e dicas para construção de uma consulta sql:

1. Ao escrever uma cláusula WHERE, sempre colocar a cláusula mais restritiva antes. Qual é a condição mais restritiva? A condição na cláusula WHERE de uma instrução que retorna o menor número de linhas de dados.

2. Evitar cláusulas WHERE que utilizam colunas não indexadas ou solicitar a criação do índice para a equipe de banco de dados. É muito importante avaliar quais colunas da tabela serão apresentadas no resultado bem como quais colunas participam da cláusula WHERE, caso tais colunas estejam dentro de um índice ‘não clusterizado’, será o caminho mais performático para sua consulta.

3.Não esquecer de colocar (NOLOCK) nas sentenças (exceto quando se aplica exceção)

4. No SELECT, trazer apenas as colunas necessárias;

Vimos este estudo no ítem 2 deste documento, escolher as colunas prioritárias que estão citadas nos índices ‘não clusterizados’ para depois adotar as demais colunas que serão cobertas pelo índice ‘clusterizado’ referente a chave primária. Caso exista alguma coluna elegível a ser associada a algum índice ‘não clusterizado’, entre em contato conosco para avaliarmos a sugestão e apresentarmos ao produto tal oportunidade de melhoria.

Obs.: é muito importante não usar o “SELECT * FROM” nas suas consultas, sempre avaliar se precisa de todas colunas da tabela para sua análise. Pode ser que uma das colunas que seriam desnecessárias para sua pesquisa possua dados que ocuparam megas, gigas de seus recursos gerando lentidão em todo o banco de dados e sistema desnecessariamente.

5. Para Sub-Selects na cláusula WHERE, considere utilizar EXISTS ao invés de IN;

6. Between no lugar de Or/And dependendo do caso? Esta é uma dúvida que sempre aparece quando precisamos usar essa cláusula, vamos entender:

SELECT * FROM PFFINANC WHERE VALOR BETWEEN 100 AND 200

SELECT * FROM PFFINANC WHERE VALOR >= 100 AND VALOR <= 200 

O predicado para essas duas consultas é o mesmo, ou seja, internamente o sgbd* entende a instrução de cima igualmente em relação a de baixo. O uso do between seria apenas para facilitar a criação da instrução, salvo o caso em que mesmo os valores das extremidades da faixa não podem entrar para o grupo apurado.

7. Order by é caro no sql. 

O uso desse recurso precisa ser bem avaliado, precisa pensar se a tela a qual o conteúdo da tabela vai ser apresentada tem recursos de ordenação, caso consiga é melhor buscar toda tabela sem organizar e fazê-lo pela aplicação. O uso do ‘order by’ é bem válido quando temos uma tabela muito grande e precisamos pegar somente alguns registros ordenados, por exemplo o uso da cláusula TOP N com o complemento do ‘order by’. Em outras palavras, não vale a pena buscar milhões de registros do banco sendo que preciso buscar os 3 primeiros com valor maior ou menor:

Dicas importantes: 

  • Tente não usar função agregada no order by, por exemplo

            ORDER BY  CAST(COLUNA AS VARCHAR(10)) DESC

  • Ao fazer um insert com o resultado de um select, nunca use o order by nesse select:

            INSERT INTO TABELA1    

                  SELECT  COLUNA1, COLUNA2 FROM TABELA2 ORDER BY COLUNA1  DESC

8. De preferência em usar JOIN no lugar de UNION. Vamos entender as diferenças entre estas cláusulas para conseguir aplicá-las sem perder a performance e objetivo da consulta:

No caso do ‘Union’, serve principalmente para unificar linhas entre duas tabelas que possuem mesmas colunas e unificar as linhas que são idênticas entre ambas. Veja que o objetivo foi atingido listando todas as linhas das tabelas eliminando as repetições:

No caso do ‘Join’, estamos falando de junções horizontais as quais podemos mesclar informações de ambas tabelas. Nesta cláusula usamos o conceito de conjuntos (união, intersecção e diferença), precisamos que ao menos uma coluna seja equivalente em ambas tabelas para gerar nossa expressão. 

9. Não use  Distinct, tente utilizar Group By no lugar. Sabemos que cada um tem seu propósito e dependendo da situação não poderemos substituir um pelo outro. Contudo se houver oportunidade de fazê-lo, tente aplicar.

10. Análise o plano de execução estimado da consulta;

O plano de execução é um ótimo aliado para avaliar as condições de performance em seus comandos, quando possível utilize até mesmo o plano de execução real para que receba a informação concretizada sobre suas consultas:



Obs.: O plano de execução estimado não consegue obter resultados de leitura em disco e demais recursos envolvidos na busca das informações do disco para apresentação na tela ao que o ‘plano de execução real’ assiste tais métricas.

Outro ponto importante sobre o uso do ‘plano de execução estimado’ é que ele se baseia nas estatísticas da base de dados, caso elas estejam desatualizadas, teremos problemas na composição deste plano.

11. Utilize flags de tipo booleano ou inteiro (colunas deste tipo), o Oracle não possui este tipo, portanto, utilize o tipo numeric (0 ou 1);

12. Evite utilizar conversões com UPPER, TO_CHAR e etc em cláusulas WHERE, esta operação faz com que o banco de dados naturalmente ignore a utilização dos índices automáticos criados para estas colunas, que tornariam a consulta bem mais rápida.

13. Não utilize HAVING para filtrar dados, caso necessite filtrar dados em um agrupamento de informações, prefira sempre realizar esta operação na cláusula WHERE ao invés do HAVING, por questões de performance, a não ser que seja necessário realizar algum filtro utilizando realmente as operações de agregação;

  • Na maioria dos casos em que não existe a necessidade de agregação, o filtro Where atende a regra de filtragem na consulta, caso necessite agrupar algum cálculo veja a possibilidade em usar também o filtro Where.
  • Uso do ‘SET NOCOUNT ON’, consegue visualizar  ganhos?

Em muitos casos um comando executado por ‘stored procedure’ pode gerar grande fluxo de informações na rede e que talvez não ser usado para qualquer regra.

Durante ‘updates’, por exemplo, na maioria dos casos não capturamos o valor das linhas afetadas, sendo gerado um fluxo de informações desnecessárias. 

Esse recurso se torna valioso quando abrimos transações demoradas se dispensamos o retorno de quantas linhas foram afetadas após o ‘commit’ .

Saiba mais

SGBD = Gerenciamento de Banco de Dados (SGBD) – do inglês Data Base Management System (DBMS)

Mais informações sobre consultas SQL's podem ser acessadas em Trabalhando com consulta SQL

Caso você precise de apoio para a realização dos ajustes procure o time de Consultoria TOTVSatravés do link Consultoria RM

 

Esse artigo foi útil?
Usuários que acharam isso útil: 0 de 0

0 Comentários

Por favor, entre para comentar.
X Fechar

Olá ,

Há pendência referente a um de seus produtos contratados para a empresa ().

Entre em contato com o Centro de Serviços TOTVS para tratativa.

Ligue! 4003-0015 opção 4 e 9 ou registre uma solicitação para CST – Cobrança – Verificação de pendências financeiras . clique aqui.

TOTVS

X Fechar

Olá ,

Seu contato não está cadastrado no Portal do Cliente como um perfil autorizado a solicitar consultoria telefônica.

Por gentileza, acione o administrador do Portal de sua empresa para: (1)configurar o seu acesso ou (2)buscar um perfil autorizado para registro desse atendimento.

Em caso de dúvidas sobre a identificação do contato administrador do Portal, ligue (11) 4003-0015, opção 7 e, em seguida, opção 4 para buscar o suporte com o time de Assessoria ao Portal do Cliente. . clique aqui.

TOTVS

X Fechar

Olá ,

Para o atendimento de "Consultoria Telefônica" você deverá estar de acordo com o Faturamento.

TOTVS

X Fechar

Olá,

Algo inesperado ocorreu, e o usuario nao foi reconhecido ou você nao se encontra logado

Por favor realize um novo login

Em caso de dúvidas, entre em contato com o administrador do Portal de Clientes de sua empresa para verificação do seu usuário, ou Centro de Serviços TOTVS.

Ligue! 4003-0015 opção 4 e 9 ou registre uma solicitação para CST – Cadastros . clique aqui.

TOTVS

Chat _

Preencha os campos abaixo para iniciar o atendimento:

Chat _