Optymalizacja zapytania w PostgreSQL

Odpowiedz Nowy wątek
2015-01-18 00:39
ZettaByte
0

Witam,
Mam następujące zapytanie w postgresie:

SELECT
    pr.id_product_recv, pr.num_recv, pr.datetime,
        p.name AS product_name,
        c.name AS category_name,
    u.id_user, u.name, u.surname
FROM product_recv pr
    INNER JOIN product p ON p.id_product = pr.id_product
    INNER JOIN username u ON u.id_user = pr.id_user
    INNER JOIN category c ON c.id_category = p.id_category
WHERE
    pr.datetime IN (
        SELECT MAX(datetime) AS last_date FROM product_recv
    );

Jego plan zapytania jest następujący:

"Nested Loop  (cost=10300.92..20664.44 rows=1 width=96)"
"  ->  Nested Loop  (cost=10300.78..20664.26 rows=1 width=83)"
"        ->  Nested Loop  (cost=10300.36..20660.20 rows=1 width=52)"
"              ->  Hash Semi Join  (cost=10300.07..20659.88 rows=1 width=40)"
"                    Hash Cond: (pr.datetime = (max(product_recv.datetime)))"
"                    ->  Seq Scan on product_recv pr  (cost=0.00..9104.83 rows=478083 width=40)"
"                    ->  Hash  (cost=10300.06..10300.06 rows=1 width=8)"
"                          ->  Aggregate  (cost=10300.04..10300.05 rows=1 width=8)"
"                                ->  Seq Scan on product_recv  (cost=0.00..9104.83 rows=478083 width=8)"
"              ->  Index Scan using id_product on product p  (cost=0.29..0.31 rows=1 width=28)"
"                    Index Cond: (id_product = pr.id_product)"
"        ->  Index Scan using id_user on username u  (cost=0.42..4.05 rows=1 width=39)"
"              Index Cond: (id_user = pr.id_user)"
"  ->  Index Scan using id_category on category c  (cost=0.14..0.16 rows=1 width=29)"
"        Index Cond: (id_category = p.id_category)"

Jestem początkujący w zakresie optymalizacji. Zastanawiam się w jaki sposób mógłbym przyspieszyć to zapytanie? Będę wdzięczny za podpowiedź. Obecny czas wykonania to 140ms.

Czy to zapytanie można sensownie przyspieszyć? Jest to na cel czysto dydaktyczny.

Pozdrawiam,

Pozostało 580 znaków

2015-01-18 00:41
ZettaByte
0

Utworzenie indeksu na pr.datetime przyspieszylo zapytanie do 11ms.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0