Como otimizar a computação em consultas

Ao avaliar o computador necessário com uma consulta, considere a quantidade de trabalho necessária. Quanto tempo de CPU é necessário? Você está usando funções como aquelas definidas pelo usuário do JavaScript que exigem recursos adicionais de CPU?

As práticas recomendadas a seguir fornecem orientações sobre como controlar a computação em consultas.

Evitar transformar dados repetidamente por meio de consultas SQL

Prática recomendada: se você estiver usando o SQL para executar operações ETL, evite situações em que você está transformando repetidamente os mesmos dados.

Por exemplo, se estiver usando SQL para cortar strings ou extrair dados usando expressões regulares, terá mais desempenho para materializar os resultados transformados em uma tabela de destino. Funções como expressões regulares requerem cálculo adicional. Consultar a tabela de destino sem a sobrecarga adicional de transformação é muito mais eficiente.

Evitar funções JavaScript definidas pelo usuário

Prática recomendada: evite usar funções JavaScript definidas pelo usuário. Use UDFs nativas em vez disso.

Chamar uma UDF JavaScript requer a instanciação de um subprocesso. Acionar esse processo e executar a UDF afeta diretamente o desempenho da consulta. Se possível, use uma UDF nativa (SQL).

Usar funções de agregação aproximadas

Prática recomendada: use uma função de agregação aproximada se seu caso de uso oferecer suporte para isso.

Se a função de agregação SQL que você está usando tiver uma função de aproximação equivalente, a função de aproximação produzirá um desempenho de consulta mais rápido. Por exemplo, em vez de usar COUNT(DISTINCT), use APPROX_COUNT_DISTINCT(). Para mais informações, consulte funções de agregação aproximadas na referência SQL padrão.

Também é possível usar funções HyperLogLog++ para fazer aproximações, incluindo agregações aproximadas personalizadas. Para mais informações, consulte as funções do HyperLogLog na referência SQL padrão.

Solicitar operações de consulta para maximizar o desempenho

Prática recomendada: use ORDER BY somente na consulta mais externa ou dentro de cláusulas de janela (funções analíticas). Coloque operações complexas no final da consulta.

Se precisar classificar os dados, filtre primeiro para reduzir o número de valores que precisa classificar. Se classificar seus dados primeiro, você classificará muito mais dados do que o necessário. É preferível classificar um subconjunto de dados do que classificar todos os dados e aplicar uma cláusula LIMIT.

Quando você usa uma cláusula ORDER BY, ela aparecerá apenas na consulta externa. Colocar uma cláusula ORDER BY no meio de uma consulta afeta muito o desempenho. Isso só não ocorre quando a cláusula é usada em uma função (analítica) de janela.

Outra técnica para ordenar a consulta é deixar as operações complexas, como expressões regulares e funções matemáticas, para o final da consulta. Novamente, essa técnica elimina o máximo de dados possível antes que as operações complexas sejam realizadas.

Otimizar os padrões de união

Prática recomendada: para consultas que unem dados de várias tabelas, otimize seus padrões de união. Comece com a maior tabela.

Ao criar uma consulta usando a opção JOIN, considere a ordem em que você está mesclando os dados. O otimizador de consulta SQL padrão pode determinar qual tabela deve ficar em qual lado da união, mas ainda é recomendável ordenar adequadamente as suas tabelas unidas. Recomenda-se colocar a tabela maior primeiro, seguida da menor, e depois por ordem decrescente de tamanho.

Quando você tem uma tabela grande no lado esquerdo do JOIN e uma pequena no lado direito do JOIN, uma união de transmissão é criada. Uma união de transmissão envia todos os dados para a tabela menor para cada slot que processa a tabela maior. Recomenda-se realizar primeiro a união de transmissão.

Para ver o tamanho das tabelas no JOIN, consulte Como conseguir informações sobre tabelas.

Eliminar consultas particionadas

Prática recomendada: ao consultar uma tabela particionada, use a pseudocoluna _PARTITIONTIME para filtrar as partições.

Ao consultar tabelas particionadas, use a pseudocoluna _PARTITIONTIME. Filtre os dados usando _PARTITIONTIME para especificar uma data ou intervalo de datas. Por exemplo, a cláusula WHERE a seguir usa a pseudocoluna _PARTITIONTIME para especificar partições entre 1 de janeiro de 2016 e 31 de janeiro de 2016:

WHERE _PARTITIONTIME
BETWEEN TIMESTAMP(“20160101”)
    AND TIMESTAMP(“20160131”)

A consulta processa dados apenas nas partições indicadas pelo intervalo de datas. Filtrar suas partições melhora o desempenho da consulta e reduz os custos.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.