Stored Outline sollen Planstabilisierung bei den folgenden Änderungen
gewährleisten:
–Oracle
Version
–Optimizer
Modus
–Optimizer
Statistiken
–Data
Volumen
–Data
Distribution
–Anlegen von
neuen Indexes
–...
-
Oracle
speichert Hints und nicht den
Execution-Plan selbst
-
Eine Outline widerspiegelt Baum-Struktur
der Query (Query Block Control Tree)
-
Hints
werden den Knoten dieser Struktur zugeordnet
-
Unter
den Hints in Outlines treten viele nicht dokumentierte auf
-
Optimizer
kann Hints in Outlines ignorieren, falls er einen besseren Execution-Plan
findet
-
Outlines
können entweder
–PUBLIC / STORED
(sind von allen Sessions greifbar, existieren solange sie explizit nicht
gelöscht werden)
oder
–PRIVATE (sind nur in einer Session greifbar, existieren solange diese Session aktiv ist). Für PRIVATE Outlines in 8i, 9i muss man Edit-Tabellen im jeweiligen Datenbankschema anlegen (s. das Package DBMS_OUTLN_EDIT)
sein
- Outlines können entweder für ein bestimmtes SQL-Statement (Kommando „Create or replace {public|private} outline“) oder für alle ab einen gewissen Zeitpunkt geparsten SQL-Statements (Kommando „alter {session|system} set create_stored_outlines“) erzeugt werden
- Einzelne Outlines werden den Outline-Kategorien zugeordnet. Diese Zuordnung erfolgt durch die Eingabe vom Kategorie-Namen beim Erzeugen von Outlines. Defaultmäßig werden Outlines der Kategorie DEFAULT zugeordnet. Diese Kategorie ist defaultmäßig aktiviert
- Aktivierung von Outlines erfolgt für eine Kategorie entweder auf Session- oder auf System-Ebene („alter {session|system} set use_stored_outlines = {<category> | {true | default}}“) . Kategorien werden auch bei einigen anderen Verwaltungsoperationen benutzt (z.B. beim Löschen von Outlines)
-
Dektivierung von Outlines erfolgt entweder auf Session- oder auf
System-Ebene („alter {session|system} set use_stored_outlines = false“)
-
Outlines,
die von einem User angelegt wurden, können für SQL’s eines anderen benutzt
werden
-
Falls
man Outlines bei der Parametereinstellung CURSOR_SHARING=FORCE|SIMILAR
erstellt, so soll man dafür nicht den ursprünglichen SQL-Text mit Konstanten
benutzen sondern einen jeweiligen aus der SQL-Area mit den generierten
Bind-Variablen. Vorsicht: in Explain Plan für den ursprünglichen SQL-Text wird fälschlicherweise angezeigt, dass die jeweilge Outline benutzt wird!
-
Bei
Oracle Installation wird der User bzw. das Schema OUTLN erzeugt
-
In
diesem Schema werden folgende Tabellen zum Verwaltung von PUBLIC Outlines
angelegt:
–OL$
–OL$HINTS
–OL$NODES
- Diese Tabellen und dazugehörige Indexes liegen im SYSTEM Tablespace. Es ist erlaubt, diese Tabellen und Indexes in einen anderen Tablespace zu verschieben
-
Man
kann Outline von einem System in ein anderes mittels Export/Import dieser 3
Tabellen übertragen
- Outlines werden nicht für recursive SQL’s (z.B in PL/SQL) in 8i und in 9i benutzt. In 10.2, 11g ist es möglich
- Da die Outlines durch den SQL-Text definiert sind, sollten die Einstellungen des Parameters CURSOR_SHARING bei der Erzeugung und bei der Benutzung von Outlines identisch sein
- Damit Outlines in 8i wirken, soll der SQL-Text identisch dem in Outlines gespeicherten Text sein. In 9i, 10g, 11g sind die folgenden Abweichungen erlaubt:
-beliebige Anzahl von Blanks und <CR> Zeichen,
-Klein- Großschreibung,
-...
Das Kriterium:
identische Outlines Signaturen
-
Man kann
Outlines unter SYS anlegen, sie werden auf SQL’s anderer Users wirken (aber
nicht auf die eigenen)
Das Tool bietet Möglichkeiten an, die Stored
Outlines für einzelne SQL’s zu
verwalten.
-
ALL_OUTLINES
- Synonym für USER_OUTLINES
-
ALL_OUTLINE_HINTS
- Synonym für USER_OUTLINE_HINTS
-
DBA_OUTLINES
- Stored Outlines
-
DBA_OUTLINE_HINTS
- Hints in Outlines
- USER_OUTLINES - Stored Outlines von einem User
- USER_OUTLINE_HINTS - Hints in Outlines von einem User
-
DBMS_OUTLN
- DBMS_OUTLN_EDIT
exp userid=\"sys/<sys_password>@<tns_alias> as sysdba\" file=ol.dmp tables=\(outln.ol\$ outln.ol\$hints outln.ol\$nodes\) query=\"where ol_ name=\'<outline_name>\'\"
imp userid=\"sys/<sys_password>@<tns_alias> as sysdba\" file=ol.dmp fromuser=outln touser=outln ignore=y
Dafür kann man das Kommando "alter outline <outline name> change category to <category name>" benutzen.
Die Outline Kategorie LEO ist in einer Session aktiv. Man sieht in der Ausgabe den Namen LEO in ASCII-Format:
SQL>oradebug dumpvar uga ugauso
qolprm ugauso_p [8A776CC, 8A776F0) = 00000001 454C0003 0000004F 00000000 00000000 00000000 00000000 00000000 00000000
Falls man die Outline Kategorie deaktiviert, so sieht man lediglich Nulls in der Ausgabe:
SQL>oradebug dumpvar uga ugauso
qolprm ugauso_p [8A776CC, 8A776F0) = 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Man kann "uga" durch "sga" in den ORADEBUG-Kommandos ersetzen, um zu prüfen, ob eine Outline Kategorie systemweit aktiviert ist.