Tenho uma consulta no seguinte formulário:
SELECT * FROM twitter_personas WHERE twitter_user_id IN ($1, $2, $3, ..., $25000)
A consulta IN tem de 10 a 25.000 valores. A consulta é executada por minutos de cada vez. Tenho um acúmulo de quase 500.000 consultas como essa para executar.
A coluna twitter_user_id é indexada. Alguma ideia de como eu poderia acelerar isso?
# \d twitter_personas
Table "public.twitter_personas"
Column | Type | Modifiers
------------------+------------------------+------------------------------------------------------------
persona_id | uuid | not null
twitter_user_id | bigint |
screen_name | character varying(40) | not null
avatar_url | text |
hashval | integer | not null default nextval('personas_hashval_seq'::regclass)
Indexes:
"twitter_personas_pkey" PRIMARY KEY, btree (persona_id)
"index_twitter_personas_on_screen_name" UNIQUE, btree (screen_name)
"index_twitter_personas_on_screen_name_persona_id" btree (screen_name, persona_id)
"index_twitter_personas_twitter_user_id" btree (twitter_user_id) WHERE twitter_user_id IS NOT NULL
IN() usando muitos parâmetros resultará em muitos casos em uma varredura de tabela sequencial. Isso pode ser lento, dependendo do tamanho da tabela e da velocidade do seu sistema.
Crie uma tabela temporária com todas as suas variáveis e junte-se a esta tabela:
Use EXPLAIN para ver a diferença entre os planos de consulta.
Outra opção é usar QUALQUER.
Fiz uma consulta com 1000 parâmetros e demorou 4 minutos usando IN e 1 segundo usando ANY. Você também pode usar ANY ARRAY em vez de ANY VALUES, mas pela minha leitura, isso é mais lento do que ANY VALUES.