Hirdetés

Keresés

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

  • bpx

    őstag

    válasz bambano #2608 üzenetére

    OK, akkor kiegészíteném annyival, hogy Oracle-ben nincs különbség.

    SELECT /*+ GATHER_PLAN_STATISTICS */ 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

    Plan hash value: 68470586

    -----------------------------------------------------------------------------------------------------
    | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
    -----------------------------------------------------------------------------------------------------
    | 0 | SELECT STATEMENT | | 1 | | 3 |00:00:00.01 | 4 |
    | 1 | SORT ORDER BY | | 1 | 1000K| 3 |00:00:00.01 | 4 |
    |* 2 | VIEW | | 1 | 1000K| 3 |00:00:00.01 | 4 |
    |* 3 | WINDOW NOSORT STOPKEY | | 1 | 1000K| 4 |00:00:00.01 | 4 |
    | 4 | TABLE ACCESS BY INDEX ROWID| ARUK | 1 | 1000K| 5 |00:00:00.01 | 4 |
    | 5 | INDEX FULL SCAN DESCENDING| I_ARU_AR | 1 | 1000K| 5 |00:00:00.01 | 3 |
    -----------------------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):
    ---------------------------------------------------

    2 - filter("T"."SORREND"<4)
    3 - filter(RANK() OVER ( ORDER BY INTERNAL_FUNCTION("ARU_EGYSEGAR") DESC )<4)

    Az első query-t egy az egyben másoltam, a másodiknál a limitet át kellett írnom, mert az itt nincs.

    SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM (SELECT
    aru_nev,aru_egysegar FROM aruk ORDER BY aru_egysegar DESC) aruk_kivonat
    where rownum < 4 ORDER BY aruk_kivonat.aru_egysegar ASC

    Plan hash value: 2883829479

    -----------------------------------------------------------------------------------------------------
    | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
    -----------------------------------------------------------------------------------------------------
    | 0 | SELECT STATEMENT | | 1 | | 3 |00:00:00.01 | 4 |
    | 1 | SORT ORDER BY | | 1 | 3 | 3 |00:00:00.01 | 4 |
    |* 2 | COUNT STOPKEY | | 1 | | 3 |00:00:00.01 | 4 |
    | 3 | VIEW | | 1 | 3 | 3 |00:00:00.01 | 4 |
    | 4 | TABLE ACCESS BY INDEX ROWID| ARUK | 1 | 1000K| 3 |00:00:00.01 | 4 |
    | 5 | INDEX FULL SCAN DESCENDING| I_ARU_AR | 1 | 3 | 3 |00:00:00.01 | 3 |
    -----------------------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):
    ---------------------------------------------------

    2 - filter(ROWNUM<4)

    0,01 másodperc, 4 darab blokk érintésével megoldotta mindkettő. Egyedüli látványos különbség, hogy az elsőnél mindenhol 1000K a becsült sorok száma.

    A 2 query egyébként nem ekvivalens, rank() helyett row_number()-rel lenne az.

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

Hirdetés