Dzięki za odpowiedź, w końcu zmiany się naniosły.
Kurde, wszystko się porozpierdzielało :| Po modyfikacjach kluczowe zapytanie przestało używać indeksu. Wczoraj w nocy włączyłem VACUUM ANALYZE. Dziś widzę, że rozmiar bazy się nie zmienił (a chyba powinien się zmniejszyć). Ponadto indeks nadal nie jest używany (a był!). To samo zapytanie u mnie na kompie używa indeksu, a na serwerze już nie. Próbowałem przeindeksować indeks ale bez rezultatu.
Może podam szczegóły:
Zapytanie:
Kod
SELECT "auctions"."start_price" AS "price", SUM(biddings.amount) AS sum_amount
FROM auctions
JOIN "biddings" ON ("biddings"."auction_id" = "auctions"."id")
JOIN "auctions_categories" ON ("auctions_categories"."auction_id" = "auctions"."id")
WHERE "auctions"."finished_at" >= '2010-01-01 00:00:00'
AND "auctions"."finished_at" <= '2010-02-28 23:59:59'
AND title_keywords @@ to_tsquery('public.polish', 'nike')
AND "auctions"."is_new" = 't'
AND "auctions_categories"."category_id" = 15583
GROUP BY "auctions"."start_price"
ORDER BY "auctions"."start_price" ASC
EXPLAIN u mnie:
Kod
"Sort (cost=36.15..36.15 rows=1 width=9)"
" Sort Key: auctions.start_price"
" -> HashAggregate (cost=36.13..36.14 rows=1 width=9)"
" -> Nested Loop (cost=0.00..36.11 rows=4 width=9)"
" -> Nested Loop (cost=0.00..16.64 rows=1 width=15)"
" -> Index Scan using i_auction_finished_at on auctions (cost=0.00..8.30 rows=1 width=11)"
" Index Cond: ((finished_at >= '2010-01-01 00:00:00'::timestamp without time zone) AND (finished_at <= '2010-02-28 23:59:59'::timestamp without time zone))"
" Filter: (is_new AND (title_keywords @@ '''nike'''::tsquery))"
" -> Index Scan using pk_auction_category_auction_id_category_id on auctions_categories (cost=0.00..8.33 rows=1 width=4)"
" Index Cond: ((auctions_categories.auction_id = auctions.id) AND (auctions_categories.category_id = 15583))"
" -> Index Scan using pk_bidding_auction_id_bought_at_position on biddings (cost=0.00..19.42 rows=4 width=10)"
" Index Cond: (biddings.auction_id = auctions.id)"
EXPLAIN na serwerze:
Kod
Sort (cost=92338.41..92338.41 rows=1 width=9)
Sort Key: auctions.start_price
-> HashAggregate (cost=92338.39..92338.40 rows=1 width=9)
-> Nested Loop (cost=6740.93..92338.35 rows=7 width=9)
-> Nested Loop (cost=6740.93..88763.08 rows=4 width=15)
-> Bitmap Heap Scan on auctions (cost=6740.93..55169.01 rows=2062 width=11)
Filter: (is_new AND (finished_at >= '2010-01-01 00:00:00'::timestamp without time zone) AND (finished_at <= '2010-02-28 23:59:59'::timestamp without time zone) AND (title_keywords @@ '''nike'''::tsquery))
-> Bitmap Index Scan on i_auction_title_keywords_description_keywords (cost=0.00..6740.41 rows=12587 width=0)
Index Cond: (title_keywords @@ '''nike'''::tsquery)
-> Index Scan using pk_auction_category_auction_id_category_id on auctions_categories (cost=0.00..16.28 rows=1 width=4)
Index Cond: ((auctions_categories.auction_id = auctions.id) AND (auctions_categories.category_id = 15583))
-> Index Scan using pk_bidding_auction_id_bought_at_position on biddings (cost=0.00..888.08 rows=459 width=10)
Index Cond: (biddings.auction_id = auctions.id)
Jak widać na serwerze olewany jest indeks i_auction_finished_at pomimo, że istnieje. O co tutaj chodzi? Jak to naprawić?
// Edit:
Wywaliłem indeks i_auction_title_keywords_description_keywords, który teoretycznie przeszkadza (jest używany zamiast tego, który chcę), ale i to nie pomogło. Sprawdziłem również banalne zapytanie:
Kod
select * from auctions where finished_at >= '2010-01-01 00:00:00' and finished_at <= '2010-01-31 23:59:59';
Na lokalu używa indeksu, na serwerze nie. Na serwerze używany jest indeks tylko dla warunku równości czyli np.
Kod
select * from auctions where finished_at = '2010-01-01 00:00:00';
Jeszcze w piątek wszystko było OK, teraz mam takie hocki-klocki :/
Z góry pięknie dziękuję za pomoc!