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 pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral