Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Modyfikacja dużej bazy danych
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
phpion
Witam,
mam bazę na PostgreSQL, która aktualnie zajmuje 77GB. Chcę nieco zmodyfikować jej strukturę (usunąć jeden indeks oraz usunąć kolumnę). Sęk w tym, że usunięcie indeksu uruchomiłem ok. 9 rano i do tej pory (15) nie ma efektu. Indeks usuwam (staram się usunąć) poprzez zapytanie wykonywane za pomocą phpPgAdmin . Moje pytanie jest następujące: jak można przyspieszyć (o ile w ogóle się da) modyfikowanie struktury tak dużej bazy danych?
Pozdrawiam,
pion
Zbłąkany
Nie da się tego przyspieszyć. Po drugie nie używaj phpPgAdmin'a, no chyba, że nie masz innej możliwości tongue.gif
phpion
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!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.