Di seguito è stata richiesta una query per circa 15 secondi per restituire i dati nonostante l'indice e id
come chiave primaria.L'ordine per query sulla colonna timestamp è molto lento
select id from my_table order by insert_date offset 0 limit 1
Il spiegano analizzare è come qui sotto
"Limit (cost=1766417.72..1766417.72 rows=1 width=12) (actual time=32479.440..32479.441 rows=1 loops=1)"
" -> Sort (cost=1766417.72..1797117.34 rows=12279848 width=12) (actual time=32479.437..32479.437 rows=1 loops=1)"
" Sort Key: insert_date"
" Sort Method: top-N heapsort Memory: 25kB"
" -> Seq Scan on my_table (cost=0.00..1705018.48 rows=12279848 width=12) (actual time=0.006..21338.401 rows=12108916 loops=1)"
"Total runtime: 32479.476 ms"
Il mio tavolo ha poche altre colonne. Ma il tipo per la insert_date
è
insert_date timestamp without time zone NOT NULL DEFAULT now(),
Ho un indice su quella particolare colonna della data che è
CREATE INDEX my_table_insert_date_indx
ON my_table
USING btree
(insert_date)
TABLESPACE somexyz_idx_ts;
pochi valori da postgresql.conf
di file:
shared_buffers = more than 1GB ## just for an example
temp_buffers = more than 1GB
work_mem = more than 1GB
maintenance_work_mem = more than 1GB
dynamic_shared_memory_type = posix
default_statistics_target = 10000
autovacuum = on
random_page_cost = 2.0
cpu_index_tuple_cost = 0.0005
Sto usando Postgres 9.3 proprio adesso.
AGGIORNAMENTO ::
Ho appena eseguito la query di seguito qualche tempo fa:
select insert_date, count(*) from my_table group by insert_date
e la parte superiore alcuni da risultato è:
"2015-04-02 00:00:00";3718104
"2015-04-03 00:00:00";6410253
"2015-04-04 00:00:00";538247
"2015-04-05 00:00:00";1228877
"2015-04-06 00:00:00";131248
ho intorno 12 milioni di record su quel tavolo. E il conteggio sopra è quasi vicino a quel totale.
Non sicuro, ma potrebbe essere un problema che l'indice sia stato creato su una colonna che ha tonnellate di valori duplicati? Se è vero, allora abbiamo un modo per aggirare?
Forse un posto migliore per chiedere: [dba.stackexchange.com] (http://dba.stackexchange.com) –
C'era una domanda simile di recente su SO, e credo che la conclusione sarebbe stata che 9.4 era meglio ordinare da una colonna indicizzata per evitare un ordinamento. Potrebbe piacere cercare quella domanda. –
Si prega di testare la stessa query con 'set enable_seqscan = off;' e mostra spiegare analizzare l'output. Quanto è grande il tuo indice e il tuo tavolo? '\ di + my_table_insert_date_indx', i comandi' \ dt + my_table' in psql mostreranno le taglie – alexius