O que é derramamento de operador no GaussDB(DWS)?
Durante a execução da consulta, se a memória do cluster for insuficiente, o banco de dados optará por armazenar os resultados temporários no disco. Quando o armazenamento em disco usado pelos resultados temporários exceder um determinado valor, os usuários receberão um alarme: "data spilling exceeds the threshold". O que significa derramamento?
Derramamento de operador para discos
Qualquer computação consome espaço de memória. Se muita memória for consumida, a memória para executar outros trabalhos será insuficiente, causando a execução instável do trabalho. Portanto, você precisa limitar o uso de memória de instruções de consulta para garantir a estabilidade da execução do trabalho.
Se uma tarefa em execução exigir 500 MB de memória, mas apenas 300 MB de memória forem alocados a ela, os dados que não forem usados temporariamente precisarão ser gravados em discos e apenas os dados que estiverem sendo usados serão retidos na memória. Isso é chamado de derramamento de dados. Também é chamado de derramamento de operador. O grande tamanho dos dados derramados para o disco pode causar 100% de uso do disco. Se isso acontecer, o banco de dados se transformará em somente leitura e o desempenho da consulta será muito afetado. Portanto, o GaussDB(DWS) impõe um limite ao derramamento do operador. Se o derramamento do operador exceder o limite, um erro é relatado e a consulta é encerrada.
Quais operadores podem derramar?
Os operadores que podem derramar para o disco incluem Hash(VecHashJoin), Agg(VecAgg), Sort(VecSort), Material(VecMaterial), SetOp(VecSetOp) e WindowAgg(VecWindowAgg). Eles podem ser vetorizados ou não vetorizados.
Quais parâmetros podem ser usados para controlar o derramamento do operador?
- work_mem: define limite de derramamento. O uso do disco que exceda esse parâmetro causará o derramamento do operador. Este parâmetro tem efeito somente quando a memória não é autoadaptativa. (enable_dynamic_workload=off). Ele garante a taxa de transferência simultânea e o desempenho de uma única tarefa de consulta. Portanto, você precisa otimizar o parâmetro com base na saída de Explain Performance.
- temp_file_limit: limita o tamanho dos arquivos derramados em discos. É aconselhável definir esse parâmetro com base nos requisitos do site para evitar que os arquivos derramados usem o espaço em disco. Arquivos derramados que excedam o valor deste parâmetro causarão um erro.
Como saber se uma instrução é derramada para discos?
- Verifique os arquivos de derramamento. Os arquivos de derramamento são armazenados no diretório base/pgsql_tmp do diretório da instância. Os arquivos de derramamento são nomeados pgsql_tmp$queryid_$pid. Você pode determinar qual instrução SQL é derramada para o disco com base na queryid.
- Verifique a exibição de espera (pgxc_thread_wait_status). Se write file for exibido no modo de exibição de espera, há resultados temporários derramados em discos.
- Verifique o plano de execução (EXPLAIN PERFORMANCE). Palavras-chave como spill, written disk e temp file num indicam que há um derramamento de operador.
- Verifique se a coluna spill_info em TopSQL em tempo real ou TopSQL histórica contém informações de derramamento. Se essa coluna não estiver vazia, os dados foram derramados para discos em DNs. (Pré-requisito: a função topsql foi habilitada.)
Como evitar o derramamento?
Quando os operadores são derramados em discos, os dados de cálculo do operador são gravados em discos. Em comparação com o acesso à memória, as operações de disco são lentas, causando deterioração do desempenho e deterioração do tempo de resposta da consulta. Portanto, tente evitar o derramamento do operador durante a execução da consulta. É recomendável usar os seguintes métodos:
- Reduzir o conjunto de resultados intermediários: se o conjunto de resultados intermediários for muito grande, você poderá adicionar critérios de filtro para reduzir o tamanho do conjunto de resultados intermediários.
- Evitar distorção de dados: se houver uma distorção grave de dados, o derramamento ocorrerá em um DN que tenha uma grande quantidade de dados.
- Realizar a ANALYZE em tempo hábil: quando as estatísticas são imprecisas, o número de linhas pode ser estimado como menor. Como resultado, o plano não é ideal e os dados são derramados para os discos.
- Realizar otimização de ponto único: realize otimização em instruções SQL únicas.
- Se a memória não for autoadaptativa e o conjunto de resultados intermediários não puder ser reduzido, aumente o valor de work_mem como apropriado.
- Se a memória for autoadaptativa, aumente a memória disponível do banco de dados o máximo possível para reduzir a probabilidade de derramamento de dados.