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

Responder a