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)