У меня есть следующая таблица и определенные индексы:
CREATE TABLE ticket
(
wid bigint NOT NULL DEFAULT nextval('tickets_id_seq'::regclass),
eid bigint,
created timestamp with time zone NOT NULL DEFAULT now(),
status integer NOT NULL DEFAULT 0,
argsxml text,
moduleid character varying(255),
source_id bigint,
file_type_id bigint,
file_name character varying(255),
status_reason character varying(255),
...
)
Я создал индекс для метки времени created
следующим образом:
CREATE INDEX ticket_1_idx
ON ticket
USING btree
(created );
и вот мой запрос
select * from ticket
where created between '2012-12-19 00:00:00' and '2012-12-20 00:00:00'
Это работало нормально, пока количество записей не начало расти (около 5 миллионов), и теперь для возврата требуется вечность.
Объясните анализ показывает это:
"Index Scan using ticket_1_idx on ticket (cost=0.00..10202.64 rows=52543 width=1297) (actual time=0.109..125.704 rows=53340 loops=1)"
" Index Cond: ((created >= '2012-12-19 00:00:00+00'::timestamp with time zone) AND (created <= '2012-12-20 00:00:00+00'::timestamp with time zone))"
"Total runtime: 175.853 ms"
До сих пор я пытался установить
random_page_cost = 1.75
effective_cache_size = 3
Также создано
create CLUSTER ticket USING ticket_1_idx;
Ничего не работает. Что я делаю неправильно? Почему он выбирает последовательное сканирование? Предполагается, что индексы делают запрос быстрым. Что-то можно сделать для оптимизации?
effective_cache_size=3
может быть слишком мало. (но, вероятно, не повредит в этом случае) - person wildplasser   schedule 22.12.2012select *
, так как это увеличит размер набора результатов, который будет передан клиенту. - person Clodoaldo Neto   schedule 27.12.2012