Pessoal
preciso obter o menor valor de uma coluna e tentei de duas formas:
a)
SELECT id_log
FROM tb_log
ORDER BY id_log
LIMIT 1;
"Limit (cost=0.57..0.62 rows=1 width=8)"
" -> Index Only Scan using pk_tb_log on tb_log (cost=0.57..7626461.90
rows=156814622 width=8)"
b)
SELECT min(id_log)
FROM tb_log;
"Result (cost=0.62..0.63 rows=1 width=0)"
" InitPlan 1 (returns $0)"
" -> Limit (cost=0.57..0.62 rows=1 width=8)"
" -> Index Only Scan using pk_tb_log on tb_log
(cost=0.57..8018482.05 rows=156814313 width=8)"
" Index Cond: (id_log IS NOT NULL)"
Ambas realizam um index only scan e levam em torno de 10 minutos pra
terminar.
Entendo que o custo está alto pois são 150 milhões de linhas, mas os dados
do índice já não são armazenados de maneira ordenada? Não seria somente o
PostgreSQL obter o primeiro valor do índice que seja válido? O quê não
estou enxergando aí?
Alguma outra solução pra obter o menor valor da coluna em tempo reduzido?
ps: por motivos diversos, não posso particionar a tabela.
Estrutura da tabela:
xxx=# \d tb_log
Table "public.tb_log"
Column | Type | Modifiers
----------------+-----------------------------+-------------------------------------------------
id_log | bigint | not null default
nextval('sq_tb_log'::regclass)
id_usuario | integer |
id_pagina | character varying(200) |
ds_ip | character varying(15) | not null
ds_entidade | character varying(50) | not null
ds_id_entidade | character varying(200) | not null
tp_operacao | character(1) | not null
dt_log | timestamp without time zone |
ds_package | character varying(150) |
Indexes:
"pk_tb_log" PRIMARY KEY, btree (id_log)
"idx_tb_log2" btree (id_usuario)
"tb_log_in02" btree (dt_log, id_usuario)
Check constraints:
"tp_operacao_check" CHECK (tp_operacao = ANY (ARRAY['I'::bpchar,
'D'::bpchar, 'U'::bpchar, 'S'::bpchar]))
Obrigado
--
Everton
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral