PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

ORDER BY indexado com LIMIT 1


Supondo que estamos lidando com uma grande mesa , um índice parcial pode ajudar:
CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC)
WHERE created_at > '2013-09-15 0:0'::timestamp;

Como você já descobriu:descer ou subir pouco importa aqui. O Postgres pode escanear para trás quase na mesma velocidade (exceções se aplicam com índices de várias colunas).

Consulta para usar este índice:
SELECT * FROM tbl
WHERE  created_at > '2013-09-15 0:0'::timestamp -- matches index
ORDER  BY created_at DESC
LIMIT  1;

O objetivo aqui é tornar o índice muito menor , por isso deve ser mais fácil armazenar em cache e manter.
  1. Você precisa escolher um carimbo de data/hora que seja menor do que o mais recente.
  2. Você deve recriar o índice de tempos em tempos para cortar dados antigos.
  3. A condição precisa ser IMMUTABLE .

Assim, o efeito único se deteriora com o tempo. O problema específico é a condição codificada:
WHERE created_at > '2013-09-15 0:0'::timestamp

Automatizar


Você pode atualizar o índice e suas consultas manualmente de tempos em tempos. Ou você automatiza com a ajuda de uma função como esta:
CREATE OR REPLACE FUNCTION f_min_ts()
  RETURNS timestamp LANGUAGE sql IMMUTABLE AS
$$SELECT '2013-09-15 0:0'::timestamp$$

Índice:
CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC);
WHERE created_at > f_min_ts();

Inquerir:
SELECT * FROM tbl
WHERE  created_at > f_min_ts()
ORDER  BY created_at DESC
LIMIT  1;

Automatize a recreação com um cron job ou algum evento baseado em gatilho. Suas consultas podem permanecer as mesmas agora. Mas você precisa recriar todos os índices usar esta função de qualquer forma depois de alterá-la. Basta soltar e criar cada um.

Primeiro ..


... teste se você está realmente atingindo o gargalo da garrafa com isso.

Tente se um índice DROP index ... ; CREATE index ... faz o trabalho. Então seu índice pode estar inchado. Suas configurações de autovacuum podem estar desativadas.

Ou tente VACUUM FULL ANALYZE para obter sua tabela inteira mais os índices em bom estado e verifique novamente.

Outras opções inclua o ajuste de desempenho geral usual e os índices de cobertura, dependendo do que você realmente recupera da tabela.