Como faço para solucionar problemas com VACUUM no Amazon Redshift?
Minhas consultas VACUUM falham no cluster do Amazon Redshift.
Breve descrição
VACUUM é uma operação que consome muitos recursos e pode ficar lenta porque ocorre o seguinte:
- Uma alta porcentagem de dados não classificados
- Uma tabela grande com muitas colunas
- O uso de uma chave de classificação intercalada
- Uso irregular ou pouco frequente de VACUUM
- Tabelas simultâneas, consultas de cluster, instruções Data Definition Language (DDL) ou trabalhos de extração, transformação e carregamento (ETL)
Use a consulta svv_vacuum_progress para verificar o status e os detalhes da operação VACUUM.
Resolução
Solucionar problemas de desempenho do VACUUM
Observação: o seguinte se aplica aos clusters provisionados do Amazon Redshift. As tabelas e consultas do sistema a seguir não funcionam no Amazon Redshift sem servidor.
Para verificar se a operação VACUUM está em andamento, execute a seguinte consulta SVV_VACUUM_PROGRESS:
dev=# SELECT * FROM svv_vacuum_progress; table_name | status | time_remaining_estimate -----------+---------------------------------+------------------------- data8 | Vacuum: initialize merge data8 | 4m 55s (1 row)
A consulta SVV_VACUUM_PROGRESS também inclui o nome da tabela, o status de VACUUM e o tempo estimado que resta até sua conclusão. Se o VACUUM não estiver em execução, a consulta SVV_VACUUM_PROGRESS mostrará o status da última execução de VACUUM. A consulta SVV_VACUUM_PROGRESS retorna somente uma linha de resultados.
Para verificar os detalhes da tabela que está sendo limpa, execute a seguinte consulta:
SELECT schema, table_id, "table", diststyle, sortkey1, sortkey_num, unsorted, tbl_rows, estimated_visible_rows, stats_off FROM svv_table_info WHERE "table" IN ('data8');
Observação: substitua table pelo nome da tabela e data8 pelo nome do esquema.
Exemplo de saída:
Schema | table_id | table | diststyle | sortkey1 | sortkey_num | unsorted | tbl_rows | est_visible_rows | stats_off ------------+----------+-------+-----------+----------+-------------+----------+-----------+------------------+----------- testschema | 977719 | data8 | EVEN | order_id | 2 | 25.00 | 755171520 | 566378624 | 100.00
Na saída anterior, a coluna sortkey1 mostra a chave de classificação principal.
Se a coluna sortkey1 mostra INTERLEAVED, a tabela tem uma chave de classificação intercalada.
A coluna sortkey_num mostra o número de colunas na chave de classificação.
A coluna não classificada mostra a porcentagem de linhas que precisam ser classificadas.
A coluna tbl_rows mostra o número total de linhas, incluindo as linhas excluídas e atualizadas.
estimated_visible_rows é o número de linhas que exclui as linhas excluídas.
Depois de uma limpeza completa (excluir e classificar), o valor de tbl_rows e estimated_visible_rows se assemelham e o valor não classificado chega a 0.
Observação: os dados na tabela são atualizados em tempo real. Para verificar o progresso de VACUUM, continue executando a consulta. As linhas não classificadas diminuem gradualmente à medida que VACUUM avança. Para confirmar se você tem uma alta porcentagem de dados não classificados, verifique as informações de VACUUM para uma tabela específica.
Execute a consulta a seguir para verificar as informações de VACUUM de uma tabela.
SELECT table_id, status, rows, sortedrows, blocks, eventtime FROM stl_vacuum WHERE table_id=977719 ORDER BY eventtime DESC LIMIT 20;
Observação: substitua 97771 pelo ID da tabela da consulta anterior.
Exemplo de saída:
table_id | status | rows | sortedrows | blocks | eventtime ----------+--------------------------------+------------+------------+--------+---------------------------- 977719 | [VacuumBG] Finished | 566378640 | 0 | 23618 | 2020-05-27 06:55:33.232536 977719 | [VacuumBG] Started Delete Only | 1132757280 | 566378640 | 47164 | 2020-05-27 06:55:18.906008 977719 | Finished | 566378640 | 566378640 | 23654 | 2020-05-27 06:46:04.086842 977719 | Started | 1132757280 | 566378640 | 45642 | 2020-05-27 06:28:17.128345 (4 rows)
No exemplo anterior, a saída lista primeiro os eventos mais recentes e, em seguida, os mais antigos, em ordem de classificação:
O último VACUUM foi um VACUUM DELETE automático que começou às 2020-05-27 06:55:18.906 008 UTC e foi concluído em alguns segundos.
Esse VACUUM liberou o espaço que as linhas excluídas ocupavam. Você pode comparar as mudanças no número de blocos que a tabela ocupou desde o início e a conclusão do VACUUM.
Observação: o Amazon Redshift executa automaticamente as operações VACUUM SORT e VACUUM DELETE em tabelas em segundo plano. Esses VACUUMs em segundo plano funcionam durante períodos de cargas reduzidas e são pausados durante períodos de alta carga. Esse VACUUM automático reduz a necessidade de executar o comando VACUUM.
A coluna sortedrows mostra o número de linhas classificadas na tabela. No último VACUUM, nenhuma classificação foi feita porque era uma operação automática VACUUM DELETE. Como as linhas ativas não foram classificadas, a linha marcada para exclusão mostra o mesmo número de linhas classificadas de quando VACUUM foi iniciado. Depois que VACUUM DELETE for concluído, você verá 0 linhas classificadas.
O VACUUM inicial que começou em 2020-05-27 06:28:17.128 345 UTC mostra um VACUUM completo. O processo liberou o espaço das linhas excluídas e das linhas classificadas após cerca de 18 minutos. Quando a operação VACUUM é concluída, a saída mostra os mesmos valores para as colunas rows e sortedrows, porque VACUUM classificou as linhas com sucesso.
Para um VACUUM que já está em andamento, continue monitorando seu desempenho e incorporando as práticas recomendadas.
Solucione problemas de VACUUM
Observação: se você receber mensagens de erro ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.
Se quiser descobrir por que uma consulta VACUUM falhou, use SYS_QUERY_HISTORY ou STL_QUERY para verificar se há mensagens de erro. Se você usar STL_QUERY, deverá obter os detalhes do erro em STL_ERROR. Como STL_ERROR não tem uma coluna de ID de consulta, encontre o campo PID em STL_QUERY. Em seguida, use esse campo na consulta STL_ERROR.
Exemplo de SYS_QUERY_HISTORY:
SELECT user_id, query_id, transaction_id, session_id, status, start_time, end_time, execution_time, error_message FROM sys_query_history WHERE query_id IN (<failed queries>) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | user_id | query_id | transaction_id | session_id | status | start_time | end_time | execution_time | error_message | | 100 | 915082632 | 35599398 | 1096641177 | failed | 2024-10-06 21:09:30.209587 | 2024-10
Se você usa a instrução execute para fazer a consulta VACUUM, use o comando describe-statement da AWS CLI para identificar mensagens de erro.
Exemplo de describe-statement:
aws redshift-data describe-statement --id 7c823348d-be8b-437a-9a0-db8c0ca44f0f { "ClusterIdentifier": "redshift-cluster-1", "CreatedAt": "2024-10-07T16:25:27.566000+00:00", "Duration": -1, "Error": "ERROR: VACUUM cannot run inside a multiple commands statement", "HasResultSet": false, "Id": "7c823348d-be8b-437a-9a0-db8c0ca44f0f", "QueryString": "vacuum full toptem;\nvacuum full tsupport;\nvacuum full supplierxbox;\nvacuum full party;", "RedshiftPid": 10723479554, "RedshiftQueryId": 42304, "ResultRows": -1, "ResultSize": -1, "Status": "FAILED", "UpdatedAt": "2024-10-07T16:25:33.566000+00:00" }
Se o cluster estiver totalmente ocioso, execute um MANUAL VACUUM para tentativas fracassadas de VACUUM. Para mais informações, consulte Limpeza e análise manual de tabelas.
Siga as práticas recomendadas para VACUUM
É possível melhorar o desempenho de VACUUM com as seguintes práticas recomendadas.
Como VACUUM é uma operação que consome muitos recursos, execute fora do horário de pico.
Use wlm_query_slot_count para substituir temporariamente o nível de simultaneidade em uma fila da operação VACUUM.
Execute a operação VACUUM com um parâmetro de limite de até 99% para tabelas grandes. Determine o limite e a frequência apropriados de execução de VACUUM. Por exemplo, talvez você queira executar VACUUM em um limite de 100% ou ter seus dados sempre classificados. Use a abordagem que otimiza o desempenho de consultas do cluster Amazon Redshift.
Execute VACUUM FULL ou VACUUM SORT ONLY com frequência suficiente para evitar que uma região da AWS não classificada se acumule em tabelas grandes.
Se houver uma grande quantidade de dados não classificados em uma tabela grande, faça uma cópia profunda.
Execute o comando VACUUM com a opção BOOST.
Divida tabelas grandes em tabelas de séries temporais para melhorar o desempenho de VACUUM. Em alguns casos, ao usar uma tabela de séries temporais, você pode eliminar a necessidade de executar VACUUM.
Escolha um tipo de compactação de coluna para tabelas grandes. As linhas compactadas consomem menos espaço em disco quando você classifica os dados.
Use o comando ANALYZE após a operação VACUUM para atualizar as estatísticas. O planejador de consultas usa esses valores para escolher os melhores planos.
Informações relacionadas
How do I troubleshoot a failed or canceled query in Amazon Redshift? (Como faço para solucionar problemas de consulta com falha ou cancelada no Amazon Redshift?)
Por que minha consulta do Amazon Redshift sem servidor foi cancelada ou interrompida?
- Tópicos
- Analytics
- Tags
- Amazon Redshift
- Idioma
- Português

Conteúdo relevante
feita há 2 anos
AWS OFICIALAtualizada há um ano