Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2024-09-29 GMT+08:00

Função

Para executar consultas complexas eficientemente, o otimizador do GaussDB(for MySQL) pode converter alguns grandes predicados IN em subconsultas IN. A conversão ocorre se as seguintes condições forem atendidas:

  • A versão do kernel do GaussDB(for MySQL) é 2.0.42.230600 ou posterior.
  • O número de elementos na lista IN excede o valor de rds_in_predicate_conversion_threshold.

Visão geral

No MySQL Community Edition, se coluna IN (const1, const2, ..... ) for executada e houver um índice na coluna, o otimizador geralmente executa uma varredura de intervalo. O parâmetro range_optimizer_max_mem_size controla a memória disponível para o otimizador de intervalo. Se houver muitos elementos na lista IN e a memória usada exceder o valor do parâmetro, a varredura de intervalo falhará e o desempenho da consulta se deteriorará. Para resolver esse problema, você pode aumentar o valor do parâmetro para expandir a memória que pode ser usada. No entanto, a memória está no nível da sessão. Isso significa que cada sessão ocupa a mesma memória, portanto, a instância pode estar sem memória. Mesmo que o otimizador de intervalo possa ser usado, se o número de elementos na lista IN exceder o valor de eq_range_index_dive_limit, serão usadas estatísticas de índice, em vez de mergulho de índice. Isso pode causar estimativa incorreta e reversão de desempenho. Após os predicados IN em subconsultas, o otimizador continuará a considerar se deve converter a cláusula IN em uma semijunção para melhorar o desempenho. Um processo de conversão específico é o seguinte.

select ... from lineitem where l_partkey in (...)

====>

select ... from lineitem where l_partkey in 
 (select tb._col_1 from (values (9628136),(19958441),...) tb)