В моей базе данных postgre у меня есть таблица с именем 'product'. В этой таблице у меня есть столбец с именем date_touched
с типом timestamp. Я создал простой индекс postgre btree в этом столбце. это схема моего стола (я опустил нерелевантные определения столбца & индекса.)Почему этот простой запрос не использует индекс в postgres?
Table "public.product"
Column | Type | Modifiers
---------------------------+--------------------------+-------------------
id | integer | not null default nextval('product_id_seq'::regclass)
date_touched | timestamp with time zone | not null
Indexes:
"product_pkey" PRIMARY KEY, btree (id)
"product_date_touched_59b16cfb121e9f06_uniq" btree (date_touched)
Таблица содержит ~ 300000 строк, и я хочу, чтобы получить элемент из n-й таблицы заказанного date_touched. когда я хочу получить 1000-й элемент, он занимает 0.2 с, но когда я хочу получить 100 000-й элемент, это заняло около 6 секунд. Мой вопрос: почему требуется слишком много времени для извлечения 100 000-го элемента, пока я определил индекс btree?
это мои запросы с explain analyze
, который показывает Postgres не использует ВТКЕЕ индекс и вместо этого рода все строки, чтобы найти элемент: 100000-
первый запрос (сотый элемент):
explain analyze SELECT product.id FROM product ORDER BY product.date_touched ASC LIMIT 1 OFFSET 1000;
QUERY PLAN
-----------------------------------------------------------------------------------------------------
Limit (cost=3035.26..3038.29 rows=1 width=12) (actual time=160.208..160.209 rows=1 loops=1)
-> Index Scan using product_date_touched_59b16cfb121e9f06_uniq on product (cost=0.42..1000880.59 rows=329797 width=12) (actual time=16.651..159.766 rows=1001 loops=1)
Total runtime: 160.395 ms
второго запроса (100 000-й элемент):
explain analyze SELECT product.id FROM product ORDER BY product.date_touched ASC LIMIT 1 OFFSET 100000;
QUERY PLAN
------------------------------------------------------------------------------------------------------
Limit (cost=106392.87..106392.88 rows=1 width=12) (actual time=6621.947..6621.950 rows=1 loops=1)
-> Sort (cost=106142.87..106967.37 rows=329797 width=12) (actual time=6381.174..6568.802 rows=100001 loops=1)
Sort Key: date_touched
Sort Method: external merge Disk: 8376kB
-> Seq Scan on product (cost=0.00..64637.97 rows=329797 width=12) (actual time=1.357..4184.115 rows=329613 loops=1)
Total runtime: 6629.903 ms
Похож на аналогичную проблему, упомянутую здесь? Проверьте настройки Postgres и машины. http://www.postgresql.org/message-id/[email protected]m – Ashalynd