Encerrando uma query
Antes de encerrar uma query, você precisa identificar quais queries estão causando problemas. Use o SQL a seguir para listar todas as queries em execução junto com sua duração:
SELECT
pid,
user_name,
starttime,
query,
elapsed
FROM
stv_recents
WHERE
state = 'Running'
ORDER BY
elapsed DESC;
Saída esperada:
| pid | user_name | starttime | query | elapsed |
|---|---|---|---|---|
| 123 | admin | 2023-10-01 10:00:00 | SELECT * FROM ? | 01:20:15 |
| 456 | analyst | 2023-10-01 10:45:00 | UPDATE table ? | 00:35:10 |
| … | … | … | … | … |
A coluna elapsed mostra há quanto tempo a query está em execução.
Depois de identificar a query problemática (usando o pid da lista acima), você pode encerrá-la. Use o seguinte comando:
CANCEL pid;
Exemplo:
CANCEL 123;
Verificando o encerramento da query
Para garantir que a query foi encerrada, execute novamente a query inicial:
SELECT
pid,
user_name,
starttime,
query,
elapsed
FROM
stv_recents
WHERE
state = 'Running'
ORDER BY
elapsed DESC;
A query encerrada não deve mais aparecer nos resultados.
Lidando com queries bloqueadas
Às vezes, queries ficam bloqueadas e precisam ser encerradas para liberar recursos. Você pode identificar queries bloqueadas usando a tabela STV_BLOCKED.
SELECT
b.pid,
b.user_name,
b.db,
b.query,
l.pid AS blocked_by_pid,
l.user_name AS blocked_by_user
FROM
stv_blocked b
JOIN
stv_locks l
ON
b.lock_owner_pid = l.pid;
Saída esperada:
| pid | user_name | db | query | blocked_by_pid | blocked_by_user |
|---|---|---|---|---|---|
| 5678 | analytics | reporting | SELECT count(*) FROM ?; | 9101 | Admin |
Para encerrar uma query bloqueada, use o comando CANCEL como mostrado anteriormente:
CANCEL 5678;
Automatizando o encerramento de queries
Para bancos de dados com requisitos rigorosos de desempenho, automatizar a detecção e o encerramento de queries de longa duração pode ser vantajoso. Abaixo está um exemplo de procedure para encerrar queries que rodam por mais tempo que um limite especificado:
DO $$
DECLARE
long_running_query RECORD;
BEGIN
FOR long_running_query IN
SELECT pid
FROM stv_recents
WHERE state = 'Running'
AND elapsed > interval '00:30:00' -- Replace with desired threshold
LOOP
EXECUTE 'CANCEL ' || long_running_query.pid;
END LOOP;
END;
$$;
Considerações importantes
- Permissões: apenas usuários com as permissões adequadas podem cancelar queries.
- Impacto: encerrar uma query pode afetar o desempenho da aplicação ou causar inconsistência de dados se feito incorretamente.
- Monitoramento: monitorar regularmente o desempenho das queries ajuda a detectar problemas cedo.
Conclusão
Gerenciar bem as queries de longa duração garante o desempenho ideal do seu cluster Amazon Redshift. Seguindo estes passos, você pode identificar e encerrar rapidamente qualquer query problemática. Implementar soluções automatizadas para monitoramento regular e encerramento de queries ajuda ainda mais a manter o desempenho.
Teste todos os comandos e scripts em um ambiente que não seja de produção antes de aplicá-los em produção, para evitar interrupções não intencionais.
Outros posts que você pode gostar:
Beekeeper Studio é um cliente de banco de dados gratuito e open source
A melhor ferramenta de consultas e edição de SQL que já usei. Tem tudo o que preciso para gerenciar meu banco de dados. - ⭐⭐⭐⭐⭐ Mit
O Beekeeper Studio é rápido, intuitivo e fácil de usar. Ele suporta vários bancos de dados e funciona muito bem no Windows, Mac e Linux.
O que os usuários dizem sobre o Beekeeper Studio
"O Beekeeper Studio substituiu completamente meu antigo fluxo de trabalho com SQL. É rápido, intuitivo e torna o trabalho com bancos de dados agradável de novo."
"Já testei muitas GUIs de banco de dados, mas o Beekeeper encontra o equilíbrio perfeito entre recursos e simplicidade. Simplesmente funciona."