Creo una tabella con righe da 43kk, le popola con i valori 1..200. Quindi ~ 220.000 per ogni numero diffuso attraverso il tavolo.Bitmap PostgreSQL La scansione dell'heap su indice è molto lenta ma la scansione solo indice è veloce
create table foo (id integer primary key, val bigint);
insert into foo
select i, random() * 200 from generate_series(1, 43000000) as i;
create index val_index on foo(val);
vacuum analyze foo;
explain analyze select id from foo where val = 55;
Risultato: http://explain.depesz.com/s/fdsm
mi aspetto totale di runtime < 1s, è possibile? Ho SSD, core i5 (1,8), 4GB di RAM. 9,3 Postgres.
Se uso Indice solo la scansione funziona molto veloce:
explain analyze select val from foo where val = 55;
http://explain.depesz.com/s/7hm
Ma ho bisogno di selezionare id non val così Incex Solo scansione non è adatto nel mio caso.
Grazie in anticipo!
Ulteriori informazioni:
SELECT relname, relpages, reltuples::numeric, pg_size_pretty(pg_table_size(oid))
FROM pg_class WHERE oid='foo'::regclass;
Risultato:
"foo";236758;43800000;"1850 MB"
Config:
"cpu_index_tuple_cost";"0.005";""
"cpu_operator_cost";"0.0025";""
"cpu_tuple_cost";"0.01";""
"effective_cache_size";"16384";"8kB"
"max_connections";"100";""
"max_stack_depth";"2048";"kB"
"random_page_cost";"4";""
"seq_page_cost";"1";""
"shared_buffers";"16384";"8kB"
"temp_buffers";"1024";"8kB"
"work_mem";"204800";"kB"
È possibile includere l'output di questa query nella domanda: 'SELECT relname, relpages, reltuples :: numeric, pg_size_pretty (pg_table_size (oid)) FROM pg_class WHERE oid = 'foo' :: regclass;' – vyegorov
@vyegorov done ! – user2138356
Si prega di fare 'ESPLORA (analizzare, buffer) 'per entrambe le query. Includere l'output di questa query: 'SELECT nome, impostazione, unità FROM pg_settings WHERE origine NOT IN ('default', 'override') UNION ALL SELECT 'versione', version(), NULL;' – vyegorov