Keresés

Új hozzászólás Aktív témák

  • bambano

    titán

    válasz bpx #2607 üzenetére

    általában a window funkcióknál nem fog, ez igaz, de én nem általában írtam, hanem a konkrét megoldásra.

    "egy ilyen egyszerű példában nincs különbség.": ezt az állítást nem ártott volna bebizonyítani, ebben az esetben kiderül, hogy tévedés, és nem készül belőle hozzászólás.

    1 millió rekordos teszt adatbázison jól láthatóan gyorsabb a sima subselectes.

    test=> explain SELECT t.aru_nev, t.aru_egysegar FROM (SELECT aru_nev,aru_egysegar, rank() OVER (ORDER BY aru_egysegar DESC) AS sorrend FROM aruk) t WHERE t.sorrend < 4 ORDER BY t.aru_egysegar;
    QUERY PLAN
    -----------------------------------------------------------------------------------------------------------
    Sort (cost=109649.00..110482.34 rows=333333 width=36)
    Sort Key: t.aru_egysegar
    -> Subquery Scan t (cost=0.00..60836.36 rows=333333 width=36)
    Filter: (t.sorrend < 4)
    -> WindowAgg (cost=0.00..48336.36 rows=1000000 width=22)
    -> Index Scan Backward using i_aru_ar on aruk (cost=0.00..33336.36 rows=1000000 width=22)
    (6 rows)

    test=> explain SELECT * FROM (SELECT aru_nev,aru_egysegar FROM aruk ORDER BY aru_egysegar DESC LIMIT 3) AS aruk_kivonat ORDER BY aruk_kivonat.aru_egysegar ASC;
    QUERY PLAN
    -----------------------------------------------------------------------------------------------------
    Sort (cost=0.15..0.16 rows=3 width=36)
    Sort Key: aruk.aru_egysegar
    -> Limit (cost=0.00..0.10 rows=3 width=22)
    -> Index Scan Backward using i_aru_ar on aruk (cost=0.00..33336.36 rows=1000000 width=22)
    (4 rows)

    time psql -d test -c 'SELECT t.aru_nev, t.aru_egysegar FROM (SELECT aru_nev,aru_egysegar, rank() OVER (ORDER BY aru_egysegar DESC) AS sorrend FROM aruk) t WHERE t.sorrend < 4 ORDER BY t.aru_egysegar;'
    real 0m0.639s
    user 0m0.024s
    sys 0m0.016s

    time psql -d test -c 'SELECT * FROM (SELECT aru_nev,aru_egysegar FROM aruk ORDER BY aru_egysegar DESC LIMIT 3) AS aruk_kivonat ORDER BY aruk_kivonat.aru_egysegar ASC'
    real 0m0.032s
    user 0m0.024s
    sys 0m0.004s

    ha kiveszem a subselecteket és azokat hajtom végre, akkor az első megoldás visszaadja az összes rekordot, a második meg csak hármat.

    Fentiek alapján melyik lekérdezés a gyorsabb, optimalizáltabb???

    "egy ilyen egyszerű példában nincs különbség.": 19.93750-szeres a különbség egymillió tesztrekordon. A teszt végére még volt üres ram a gépben, tehát nem az döntött, hogy az egyiket vinyóról futtatná, a másikat memóriából, minden teszt teljesen befért a ramba.

    [ Szerkesztve ]

    Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

Új hozzászólás Aktív témák