programmera.net -> oracledba -> normal för utskrift | info@programmera.net |
Library Cache
1. Library Cache 2. Unika SQL-satser 3. Bind-variabler 4. Konfigurera Library Cache |
1. Library Cache
Minnesarean Library Cache lagrar följande:
När en serverprocess tar emot en förfrågan att köra en SQL-sats från klienten så letar den först i Library Cache efter exekveringsplanen för denna SQL-sats. Först om exekveringsplanen inte hittas i Library Cache så parsar serverprocessen SQL-satsen. Fördelen med att alla serverprocesser delar på samma Library Cache är att sessioner kan utnyttja andra sessioners redan parsade SQL-satser. Om man t.ex. har 100 sessioner som alla kör samma SQL-sats så kommer SQL-satsen att parasas bara en gång, detta sparar mycket CPU.
2. Unika SQL-satser
Oracle identifierar SQL-satser i Library Cache genom att beräkna en hashnyckel utifrån SQL-strängen. Om det finns en exekveringsplan i Library Cache som mappar mot denna hashnyckel kommer den funna exekveringsplanen att utnyttjas, annars påbörjar serverprocessen en parsning av SQL-satsen. Vi tittar på några SQL-satser:
Eftersom dessa 3 satser inte har exakt identisk SQL kommer de generera olika hashnycklar och ses av Library Cache som unika SQL-satser. För att Library Cache ska fungera bra får det inte finnas för många unika SQL-satser. Eftersom varje unik SQL-sats kommer att parsas och exekveringsplanen lagras i Library Cache konsumerar varje unik SQL-sats en viss mängd resurser. Kostnaden för varje unik SQL-sats är:
SELECT * FROM emp WHERE empid=14;
SELECT * FROM emp WHERE empid=13;
SELECT empid FROM emp WHERE empid=13;
Ett exempel:
Alltså: Om varje SQL-sats är unik är det bättre att ha en mycket liten Library Cache, så att man slipper den overhead som krävs för att administrera en stor mängd lagrade exekveringsplaner som aldrig används.
3. Bind-variabler
Hur kan vi då få ner antalet unika SQL-satser? Svaret är att använda Bind-variabler i SQL-satserna.