Unten Abfrage dauert ungefähr 15 Sekunden, um Daten zurückzugeben, trotz eines Index und der id
als Primärschlüssel.Reihenfolge nach Abfrage in Zeitstempelspalte ist sehr langsam
select id from my_table order by insert_date offset 0 limit 1
Die Analyse erklären ist, wie unten
"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"
Meine Tabelle einige andere Spalten. Aber der Typ für die insert_date
ist
insert_date timestamp without time zone NOT NULL DEFAULT now(),
Ich habe einen Index auf dieser Spalte bestimmten Datum die
CREATE INDEX my_table_insert_date_indx
ON my_table
USING btree
(insert_date)
TABLESPACE somexyz_idx_ts;
Nur wenige Werte von postgresql.conf
Datei ist:
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
ich verwende Postgres 9.3 jetzt sofort.
UPDATE ::
Ich lief die unter Abfrage vor einer Weile:
select insert_date, count(*) from my_table group by insert_date
und die oberen paar aus dem Ergebnis ist:
"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
Ich habe 12 um Millionen Datensätze auf dieser Tabelle. Und die obige Zählung ist fast nah an dieser Summe.
Nicht sicher, aber könnte es ein Problem sein, dass der Index für eine Spalte erstellt wurde, die Tonnen von doppelten Werten enthält? Wenn es wahr ist, haben wir dann einen Weg?
Vielleicht zu einem besseren Ort zu fragen: [dba.stackexchange.com] (http://dba.stackexchange.com) –
gab es eine ähnliche Frage vor kurzem auf SO, und ich denke, die Schlussfolgerung gewesen sein könnte, dass 9.4 war besser beim Ordnen durch eine indizierte Spalte, um eine Sortierung zu vermeiden. Möchte gerne nach dieser Frage suchen. –
Bitte prüfen Sie dieselbe Abfrage mit 'set enable_seqscan = off;' und zeigen Sie explain analyze output an. Wie groß ist dein Index und Tisch? '\ di + my_table_insert_date_indx',' \ dt + my_table' Befehle in psql zeigen die Größen – alexius