Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Modyfikacja dużej bazy danych
phpion
post 3.04.2010, 14:10:45
Post #1





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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
Go to the top of the page
+Quote Post
Zbłąkany
post 4.04.2010, 11:36:46
Post #2


Administrator serwera


Grupa: Developerzy
Postów: 521
Pomógł: 13
Dołączył: 2.04.2004
Skąd: 52°24' N 16°56' E

Ostrzeżenie: (0%)
-----


Nie da się tego przyspieszyć. Po drugie nie używaj phpPgAdmin'a, no chyba, że nie masz innej możliwości tongue.gif


--------------------
Środowisko: Gentoo 2008.0 | Apache | PHP5 | PostgreSQL | MySQL | Postfix
Workstation: Gentoo 2008.0 | Firefox
Thomas Alva Edison: "Aby coś wynaleźć wystarczy odrobina wyobraźni i sterta złomu ..."
Odpowiedź na każde pytanie typu "Jak ...": "Nie da się, to nie PostgreSQL"
Go to the top of the page
+Quote Post
phpion
post 4.04.2010, 14:02:15
Post #3





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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!

Ten post edytował phpion 4.04.2010, 14:02:49
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 08:56