Temat: Modyfikacja dużej bazy danych
Ta najprostsza wersja zapytania:
select * from auctions where finished_at = '2010-01-01 00:00:00';
versus
select *
from auctions
where
finished_at >= '2010-01-01 00:00:00' and
finished_at <= '2010-01-31 23:59:59';
sugorowałaby, że masz po prostu mało selektywny warunek.
1. Zobacz ile masz różnych wartości tego pola.
select count(distinct finished_at) from auctions;
(nie wiem czy działa na PG)
- jeśli ta wartość jest >= od "sporego procentu" - powiedzmy 20% (dokładnie nie wiem) całkowitej liczby rekordów, to optymalizator po prostu olewa taki warunek i obsługuje go na piechotę.
2. "index scan" to tak naprawdę i tak jest mało zabawna sytuacja.
- baza przelatuje wszystkie rekordy, tylko zamiast chodzić po stronach bazy, chodzi po stronach indeksu. Więc tak na prawdę dużo lepiej "u ciebie" nie jest.
3. Spróbuj do pełnego zapytania dodać inne (np. nadmiarowe) warunki.
Np.
AND "auctions"."category_id" = 15583
4. Warunek na "is_new" chyba niewiele Ci pomoże (jeśli chodzi o indeksowalność).
5. Masz indeks na start_price? Spróbuj - może to być to czego szukasz.
6. "Select *" może być mylący dla DBMS-a, do testów używaj:
select start_price from auctions where finished_at = '2010-01-01 00:00:00';
(lub dowolne inne pole, które i tak będziesz wyciągał).
7. Być może warto zmienić pole timestamp na date.
Bo chyba i tak szukasz wg. dni a nie godzin.
Można też zrobić indeks na funkcji.
Najlepiej pomógłby Ci ktoś kto się zajmuje PG na codzień - ja mało tego DBMS-a używałem.
Piotr Likus edytował(a) ten post dnia 05.04.10 o godzinie 18:23