Más táblákra vonatkozó lekérdezések Nikovits.Cikk (ckod, cnev, szin, suly) Nikovits.Projekt (pkod, pnev, helyszin) Nikovits.Szallito (szkod, sznev, statusz, telephely) Nikovits.Szallit (szkod, ckod, pkod, mennyiseg, datum) x A tervekben néhol a PLAN_TABLE.position oszlop értéke is szerepel, hogy / \ lássuk az azonos szinten levő műveleteket milyen sorrendben végzi. / \ 1 2 -- Nem használ indexet, nem alakítja át a kifejezést select sum(suly) from cikk where ckod+1=2; ------------------------------------------ SELECT STATEMENT SORT AGGREGATE TABLE ACCESS FULL CIKK -- Itt egyszerűsít, és használ indexet select sum(suly) from cikk where ckod=floor(sqrt(44*23)); --------------------------------------------------------- SELECT STATEMENT SORT AGGREGATE TABLE ACCESS BY INDEX ROWID CIKK INDEX UNIQUE SCAN C_CKOD -- Meddig látja célszerűnek az index használatát a költség alapú -- optimalizáló? Ennél pl. nem használ indexet select sum(suly) from cikk where ckod < 500; -------------------------------------------- SELECT STATEMENT SORT AGGREGATE TABLE ACCESS FULL CIKK -- Ennél még használ indexet select sum(suly) from cikk where ckod < 10; ------------------------------------------- SELECT STATEMENT SORT AGGREGATE TABLE ACCESS BY INDEX ROWID CIKK INDEX RANGE SCAN C_CKOD -- Adjuk meg azokat a szállitó, projekt párokat, ahol a szallitó -- telephelye megegyezik a projekt helyszínével és a szállító által -- ehhez a projekthez szállított cikkek összmennyisége > 5000 SELECT szallito.szkod, projekt.pkod, telephely FROM szallito, szallit, projekt WHERE szallit.szkod=szallito.szkod AND szallit.pkod=projekt.pkod AND telephely=helyszin GROUP BY szallito.szkod, projekt.pkod, telephely HAVING SUM(mennyiseg) > 5000; --------------------------------------------------------------- SELECT STATEMENT FILTER SORT GROUP BY NESTED LOOPS NESTED LOOPS TABLE ACCESS FULL PROJEKT TABLE ACCESS BY INDEX ROWID SZALLIT INDEX RANGE SCAN SZT_PKOD TABLE ACCESS BY INDEX ROWID SZALLITO INDEX UNIQUE SCAN SZO_SZKOD -- Mint az előző feladat, csak most a piros cikkekre vonatkozó -- mennyiségeket adjuk össze SELECT szallito.szkod, projekt.pkod, telephely FROM szallito, szallit, projekt, cikk WHERE szallit.szkod=szallito.szkod AND szallit.pkod=projekt.pkod AND szallit.ckod=cikk.ckod AND szin='piros' AND telephely=helyszin GROUP BY szallito.szkod, projekt.pkod, telephely HAVING SUM(mennyiseg) > 500; ---------------------------------------------------------------- SELECT STATEMENT FILTER SORT GROUP BY NESTED LOOPS NESTED LOOPS NESTED LOOPS TABLE ACCESS BY INDEX ROWID CIKK INDEX RANGE SCAN C_SZIN TABLE ACCESS BY INDEX ROWID SZALLIT INDEX RANGE SCAN SZT_CKOD TABLE ACCESS BY INDEX ROWID PROJEKT INDEX UNIQUE SCAN P_PKOD TABLE ACCESS BY INDEX ROWID SZALLITO INDEX UNIQUE SCAN SZO_SZKOD -- Másik terv SELECT STATEMENT FILTER HASH GROUP BY NESTED LOOPS NESTED LOOPS HASH JOIN TABLE ACCESS FULL CIKK TABLE ACCESS FULL SZALLIT TABLE ACCESS BY INDEX ROWID SZALLITO INDEX UNIQUE SCAN SZO_SZKOD TABLE ACCESS BY INDEX ROWID PROJEKT -- Adjuk meg a piros cikkekre vonatkozó összes szállítások összmennyiségét ... A lekérdezést önállóan adjuk meg ---------------------------------------------------------------- SELECT STATEMENT SORT AGGREGATE NESTED LOOPS TABLE ACCESS BY INDEX ROWID CIKK INDEX RANGE SCAN C_SZIN TABLE ACCESS BY INDEX ROWID SZALLIT INDEX RANGE SCAN SZT_CKOD Adjunk olyan hintet, hogy ne használjon indexet, ill. csak 1 indexet használjon. ... -- Adjunk olyan hintet, hogy SORT-MERGE JOIN-t végezzen ... ---------------------------------------------- SELECT STATEMENT SORT AGGREGATE MERGE JOIN SORT JOIN TABLE ACCESS BY INDEX ROWID CIKK INDEX RANGE SCAN C_SZIN SORT JOIN TABLE ACCESS FULL SZALLIT Ha a nem piros cikkekre vonatkozó összmennyiséget kérdezzük le, az sokkal tovább fog futni, mert a köztes eredmény mérete nagyobb, és ezt rendeznie kell. -- Most egy clusterre került a cikk és szállít tábla create cluster ckod_cl(ckod integer); create index ckod_i on cluster ckod_cl; create table cikk_ind_cl(ckod, cnev, szin, suly) cluster ckod_cl(ckod) as select * from cikk; create table szallit_ind_cl(szkod, ckod, pkod, mennyiseg, datum) cluster ckod_cl(ckod) as select * from szallit; -- Adjuk meg a szállított piros cikkek összmennyiségét SELECT sum(suly) FROM cikk_ind_cl NATURAL JOIN szallit_ind_cl WHERE szin='piros'; ----------------------------------------------------------- SELECT STATEMENT SORT AGGREGATE NESTED LOOPS TABLE ACCESS BY INDEX ROWID CIKK_IND_CL INDEX RANGE SCAN C_SZIN1 TABLE ACCESS CLUSTER SZALLIT_IND_CL -- másik terv SELECT STATEMENT SORT AGGREGATE NESTED LOOPS TABLE ACCESS FULL CIKK_IND_CL TABLE ACCESS CLUSTER SZALLIT_IND_CL INDEX UNIQUE SCAN CKOD_I -- Most egy hash clusterre került a cikk és szállít tábla create cluster ckod_hash(ckod integer) hashkeys 31; create table cikk_hash_cl(ckod, cnev, szin, suly) cluster ckod_hash(ckod) as select * from cikk; create table szallit_hash_cl(szkod, ckod, pkod, mennyiseg, datum) cluster ckod_hash(ckod) as select * from szallit; -- Adjuk meg a szállított piros cikkek összmennyiségét SELECT sum(suly) FROM cikk_hash_cl NATURAL JOIN szallit_hash_cl WHERE szin='piros'; ------------------------------------------------------------- SELECT STATEMENT SORT AGGREGATE NESTED LOOPS TABLE ACCESS FULL CIKK_HASH_CL TABLE ACCESS HASH SZALLIT_HASH_CL -- Join nélkül is hash módszerrel olvassa a szallit táblát select * from szallit_hash_cl where ckod=1; ------------------------------------------- SELECT STATEMENT TABLE ACCESS HASH SZALLIT_HASH_CL Példa arra, amikor két indexet használ egy táblához. A sorazonosítók metszetét képezi (AND-EQUAL), majd ezen mutatók mentén olvassa a táblát. select /*+ and_equal(sz, szt_ckod, szt_szkod) */ sum(mennyiseg) from nikovits.szallit sz where ckod=9 and szkod=9; ------------------------------------------------------------ SELECT STATEMENT SORT AGGREGATE TABLE ACCESS BY INDEX ROWID SZALLIT AND-EQUAL INDEX RANGE SCAN SZT_CKOD INDEX RANGE SCAN SZT_SZKOD A két index által visszaadott sorazonosítókat más módszerrel is össze tudja fésülni. Az alábbi tervhez nem kell bitmap indexnek lennie. A szükséges bitvektorokat az indexből beolvasott sorazonosítók alapján is fel tudja építeni, majd ezekkel végez műveletet, végül visszaalakítja aorazonosítókká. select sum(mennyiseg) from szallit where ckod=9 and szkod=9; ------------------------------------------------------------ SELECT STATEMENT SORT AGGREGATE TABLE ACCESS BY INDEX ROWID SZALLIT BITMAP CONVERSION TO ROWIDS BITMAP AND BITMAP CONVERSION FROM ROWIDS INDEX RANGE SCAN SZT_CKOD BITMAP CONVERSION FROM ROWIDS INDEX RANGE SCAN SZT_SZKOD -- Példa arra, hogy azonos tervek még különböző futási időt adhatnak. -- Ha ckod > 999-et adunk meg akkor sokkal gyorsabb lesz, pedig a terv ugyanaz. select /*+ full(c) use_nl(c, sz) */ sum(mennyiseg) from nikovits.cikk c, nikovits.szallit sz where c.ckod < 999; -------------------------------------------------------------- SELECT STATEMENT SORT AGGREGATE NESTED LOOPS TABLE ACCESS FULL SZALLIT TABLE ACCESS FULL CIKK -- A fenti rendezés (SORT AGGREGATE) még mindig sokkal olcsóbb, mint az alábbi, ami -- sokáig fut (SORT ORDER BY). select /*+ use_nl(c, sz) */ * from nikovits.cikk c, nikovits.szallit sz order by c.ckod; ------------------------------------------------ SELECT STATEMENT SORT ORDER BY NESTED LOOPS TABLE ACCESS FULL SZALLIT TABLE ACCESS FULL CIKK