Az explicit és implicit kurzorokról, méretméretekről és időközökről

Tom Kite: Az explicit és implicit kurzorokra,
méretek és komplex időközök
(Az Explicit, a Méret és a Komplexum). Tom Kyte

Szakértőünk válaszol a kurzorokra, a kiterjedésekre és az intervallumokra vonatkozó kérdésekre.

Kérdés: Igazán igaz, hogy az Oracle7 7.3 verziótól kezdve az implicit kurzorok optimalizáltak és nem végeznek dupla mintavételt? Továbbá, miért a következő implicit kurzor gyorsabb alábbi explicit kurzor, ha a táblázat T van egy index X oszlopban, míg más kifejezett kurzor fut gyorsabban?

Válasz: Implicit kurzor:

Egy rövid definícióval kezdem, hogy mindenki megértse, mi implicit és explicit kurzor.

Általában egy implicit kurzor olyan kurzor, amelyet a programozó "nem kifejezetten" deklarál, nyit, választ ki vagy zár le; ezek a műveletek implicitek. Tehát a fenti példában a SELECT X INTO Y lekérdezés implicit kurzor. Ehhez nincs meghatározás a "cursor cursor_name is" kifejezésre. A második példában viszont egy klasszikus explicit kurzor jelenik meg. A programozó kifejezetten kijelenti, megnyitja, választja ki és bezárja.

Tehát a valóban implicit kurzorok a PL / SQL-ben gyorsabbak, mint az explicit kurzorok, és gyorsabbak az Oracle7 Release 7.3 kiadása előtt. Tény, hogy van egy tesztcsomagja, amely azt mutatja, hogy ez valóban az Oracle7 7.1 verziójú adatbázishoz tartozik (lásd az asktom.oracle.com/ e teszteket

tkyte / ivse.html). Az ok, amiért az implicit kurzorok gyorsabb (implicit kurzorok kurzor Ciklusok és implicit kurzorok a kimutatások SELECT INTO), abban a tényben rejlik, hogy ebben az esetben, PL / SQL gép szükséges értelmezi és végrehajtja sokkal kevesebb a kódot. Általában, minél több PL / SQL kódot lehet "rejtett", annál gyorsabban fog működni. A fent látható implicit kurzor esetében egy PL / SQL kódot kell megadni; egy explicit kurzor esetében legalább három sornyi kód szükséges, és ha "jobb", akkor ténylegesen hat sornyi kódra van szüksége. Az explicit kód nem végzi el az implicit kurzor összes munkáját, amely azt ellenőrzi, hogy garantált-e egy és egy sor. Az Ön explicit kódja hiányzik sok mindent, amit meg kell tennie. A két példa kurzorának pontos összehasonlításához az explicit kódnak több sorral kell rendelkeznie:

Ha ez volt az explicit kurzor, azt találná, hogy az explicit kurzor minden esetben lassabb, még a példában is, index nélkül vagy anélkül.

Egy csomó tömböt hozott létre; Ez a pctfree 99 paraméter beállításával történik, amely a blokkterület 99 százalékát fenntartja a későbbi blokkfrissítésekhez ("szabad terület"). Tehát, bár a táblázatban szereplő adatok mennyisége kicsi, maga a táblázat elég nagy. Ezenkívül a táblázatba illesztettem az 1., 2., 3. és 29.264 értékeket, amelyek nagyrészt rendben vannak elhelyezve. Tehát az X = 1 érték az asztal "első" blokkjában van, és az X = 29.000 érték elég közel van a táblázat utolsó blokkjához.

Ez magyarázza a kurzorok viselkedését: a SELECT INTO utasítás egy második sort ellenőrz, míg az explicit kurzor nem. Ha összehasonlítjuk almát almával -, vagy hogy egy másik átlátszó minta, vagy adjunk hozzá egy állítmány „rownum = 1” az üzemeltető SELECT INTO - azt találjuk, hogy mindkét kurzor elvégzi ugyanazt a mennyiségű munkát.

Kérdés: Új alkalmazásunkhoz adatbázisokat terveztünk és létrehoztunk egy adatmodellt. A táblázatok méretét is meghatároztuk, és meghatározzuk az egyes táblák tárolási paramétereit. De most szakembereink adatbázis adminisztráció azt mondja, hogy megadja nekünk a három táblaterületeken: TS_small (asztal hely kicsi) azonos mértékben mérete 160 KB, TS_med (asztal tér egy közepes méretű) ugyanolyan mértékben mérete 5 MB , és a TS_large (nagy asztali hely) ugyanolyan méretű 160 MB méretű. Azt mondják, hogy szükség van a táblákat létrehozni, amelynek mérete kisebb, mint 5 MB tablespace TS_small, tábla mérete kisebb lesz, mint 160 MB, TS_med és asztalok, amelynek mérete több lesz, mint 160 MB, TS_large. Ráadásul nem akarják, hogy az asztal szintjén tárolási paramétereket használjunk. Azt mondják, hogy ugyanaz legyen az indexek esetében is. Ez nem tűnik számomra ésszerűnek, mivel a TS_med táblaterületen 120 MB méretű táblát kell elhelyezni, és ez 24-et igényel! Az adatbázis-adminisztrátorok azzal érvelnek, hogy számos teszt bizonyította, hogy az ilyen kialakítás a legnagyobb teljesítményt nyújtja és megakadályozza a töredezettséget. Kérdésem: igazuk van? Aggódom az ilyen tárgyakkal.

A: Hát, úgy néz ki, mintha olvasott weboldal „Kérdezd Tom” (asktom.oracle.com), és eszmecsere csoportok érdekeit az interneten, és találtam egy jó ajánlást. A számukra tekintve látom, hogy egy 5 GB-os asztal 32 vagy annál kevesebb lehet. Tekintettel arra, hogy több száz (vagy akár több) terjedelem nem befolyásolja a DML nyilatkozatok teljesítményét, azt mondanám, hogy kiváló munkát végeztek.

Mindkét feltevés helyes: a táblaterületek széttöredezettsége lehetetlen, és a teljesítmény optimális. Nézzük meg minden kijelentést.

Az a tény, hogy a fragmentáció nem lehetséges, könnyen ellenőrizhető. A szótár által kezelt táblaterület segítségével kezelt táblaterület a különböző méretű kiterjedések miatt töredezett. Az adatszótár használatával kezelt táblaterület több ezer kiterjesztésű, ingyenes és használható, amelyek mindegyike eltérő méretű lehet. Most elkezded elpusztítani és létrehozni az objektumokat ebben a táblaterületben, és idővel számos méretű "lyuk" létezik benne. Tehát ellenőrizheti az adat szótár által kezelt táblaterületet, és meghatározhatja a szabad hely méretét, 500 szabad MB felfedezését. De amikor megpróbál létrehozni egy táblát a kezdeti kiterjedésű 40 MB-os mérettel, hibát kapsz - lehetetlen elosztani az első lépést. Hogyan történhet ez meg? 500 ingyenes MB van, ugye? Igen, igen, de sajnos ezek az 500 MB-k sok mindent tartalmaznak, amelyek mindegyikének mérete kisebb, mint 40 MB! Tehát sok haszontalan szabad terület van - a táblaterületed töredezett. Most vegye fontolóra egy helyileg kezelt táblaterületet, amelynek azonos méretű kiterjedése van. Itt minden kivétel nélkül ugyanolyan méretű, mint minden más kiterjedés. Ha úgy találja, hogy van 500 MB szabad, biztosíthatom önöket, hogy Ön képes lesz arra, hogy jelöljenek ki egy új mértékben a táblázatban térben, mint minden szabad mértékben, definíció szerint, lehet használni kívánt objektumot.

tkyte / extents.html és asktom.oracle.com/

tkyte / extents2.html. amelyek mindegyikében elég hosszú vita folyik e témáról. A tárgyak harminckét nagysága kiváló, a teljesítményre semmilyen hatás nem lesz. Valójában, mivel LMTs sokkal hatékonyabb elosztása a tér, mint az asztal tér által ellenőrzött adatszótárra és azok használatáról a termelékenység növelése, és nem fordítva.

Kérdés: A DBMS_JOB csomagot használom, és hétfőtől péntekig 15 percenként ütemezem a feladatok elindítását, reggel 6-tól reggel 6-ig este. Hogyan lehet ezt tenni? Nem tudom kiszámítani a csomagnak átadott intervallumot.

Válasz: Nos, ahhoz, hogy kiszámolhassam a DBMS_JOB csomag összetett időközöket, szeretnék használni az új (az Oracle8i Release 2) CASE operátortól. Például a következő CASE utasítás adja vissza a specifikáció helyes időtartamát:

A CASE nyilatkozat nagyobb rugalmasságot biztosít a szükséges összetett érték előállításához. Sajnos DBMS_JOB csomag lehetővé teszi, hogy csak olyan időközönként, amelyek hossza nem haladja meg a 200 karaktert, és akkor is, ha „squeeze” látható a fenti állítás, úgy találja, hogy a hossza nagyjából megegyezik a legalább 300 karaktert. Tehát nem használhatja közvetlenül a DBMS_JOB csomagcsomagban. A megoldás a következő: vagy én jött volna létre az ötlet NEXT_DATE az üzemeltető select * from next_date vissza a következő feladat fut, vagy azt felismerték a fenti állítás a PL / SQL-függvény, amely visszaadja a dátumot. Ha nézetet használtam, a DBMS_JOB csomaghoz tartozó hívásom így nézhet ki: /

Kérdés: Számos táblázattal rendelkezünk, az idő függvényében (pénzügyi év). Mit ajánl a legjobb megoldás, hogy van, hogy a történelmi adatok „read-only”, és a hozzáférést a jelenlegi adatok - a módban a „read-write”?

Válasz: Valóban ez elég könnyű elérni. A táblaterület csak olvasható módban vagy írás-olvasási módban lehetséges. Ha egy külön táblázatot tér minden partíciót (vagy legalábbis tartani a történeti rész külön táblázatban helyet, mint a mostani), akkor meg kell tenni csak „read-only”, akkor egyszerűen végre egy ALTER TABLESPACE <имя табличного пространства> KÉRDEZZE CSAK. A végfelhasználók nem lehet módosítani a táblázat helyet, és valójában, akkor mentse jelentős mennyiségű időt töltött a fenntartás, mert akkor meg kell hozzon létre egy biztonsági másolatot egyszerre (hacsak nem teszed azt a módot „read-write”, és módosítsa akkor ebben az esetben természetesen újra létre kell hoznia a biztonsági másolatot).

Valójában még ezt a táblaterületet is áthelyezheti olvasható adathordozókra, például CD-kre, és megakadályozhatja annak módosítását.

Kérdés: Magyarázd el, mi a rekurzív hívások, a db blokk stb.

Az Oracle kiszolgáló támogatja a belső műveletekhez használt táblákat. Ha az Oracle kiszolgálónak ezeket a táblázatokat módosítania kell, akkor a rendszerben SQL utasítás jelenik meg, amely viszont rekurzív hívásokat generál.

Röviden, a rekurzív hívások alapvetően az SQL utasítások nevében végrehajtott SQL utasítások. Tehát például, ha meg akarja vizsgálni a lekérdezést, előfordulhat, hogy más lekérdezéseket futtat, hogy információt szerezzen az adatszótárból. Ez rekurzív hívások. A területkezelés, a hozzáférés-vezérlési szabályok ellenőrzése, az SQL utasításokból származó PL / SQL eljárások hívása minden esetben rekurzív hívásokat eredményez.

  • DB blokk (adatblokkok olvasása). A CURRENT módban kapott blokkok száma.

Olvassa el az Oracle9i dokumentációt:
Oracle9i adatbázis teljesítmény-beállítási útmutató és hivatkozás
otn.oracle.com/docs/products/oracle9i/
doc_library / release2 / server.920 / a96533 / autotrac.htm # 14931

Kérje a hangerőt
asktom.oracle.com
Tom Kite - az Oracle Kormány, Oktatás és Egészségcsoport alelnöke - válaszol az Oracle adatbázis-technológiára vonatkozó legnehezebb kérdésekre. A fórum legélénkebb anyagai ebben az oszlopban kerülnek közzétételre.

LEARN Kurzorok:
asktom.oracle.com/

  • Következetes értékek A blokkok blokkolásának számát csak olvasható műveletek végrehajtására kérték.

Alapvetően ez lesz az eredményhalmaz összesített mérete.

  • Byte fogadott SQL * Net a kliensből (az SQL * Net kliensből érkező bájtok). Az ügyfél által a hálózaton keresztül fogadott összes bájt.

Alapjában véve ez a kérés nagysága, abban a formában, amelyben a hálózaton keresztül kerül továbbításra

  • SQL * Net Körutazások az ügyfélről / ügyfélről (kölcsönös cserék SQL * Net segítségével az ügyféllel). Az ügyféltől küldött vagy fogadott hálózati üzenetek teljes száma.

Alapvetően ez a kapcsolódási szám a szerverrel, hogy megkapja a választ. Miután növelte az ARRAYSIZE rendszer változó értékét az SQL * Plus-ban, akkor látni fogja, hogy ez a szám a SELECT utasításoknál, amelyek több sorba visszaadnak (kisebb kölcsönös cserék, mivel minden egyes N vonal kivonat kölcsönös cseréje). Amikor csökkentette az ARRAYSIZE értéket, látni fogja, hogy ez a szám növekszik.

  • Sortek (memória). A RAM-ban teljesen végrehajtott rendezési műveletek száma, és nem íródott lemezre.

Nem lehet sokkal jobb, mint a válogatás a memóriában, talán csak a válogatás kizárásával. A rendezések általában olyan lekérdezések végrehajtása során következnek be, amelyek a minta feltételeinek specifikációjában tartalmazzák a táblák csatlakozási műveleteit.

  • Sorozatok (lemez). A rendezési műveletek száma, amelyek egy lemezenként legalább egy rekordot igényeltek. Az I / O lemezeket igénylő rendezők intenzíven fogyasztanak erőforrásokat. Próbálja meg növelni az SORT_AREA_SIZE inicializálási paraméter értékét.
  • Feldolgozott sorok (feldolgozott sorok). A SELECT utasítás által visszaadott vagy az INSERT, UPDATE vagy DELETE utasítással módosított sorok teljes száma.