Stored Outlines

•Planstabilisierung bei den folgenden Änderungen:

Stored Outline sollen Planstabilisierung bei den folgenden Änderungen gewährleisten:

–Oracle Version

–Optimizer Modus

–Optimizer Statistiken

–Data Volumen

–Data Distribution

–Anlegen von neuen Indexes

–...

 

Konzept von Outlines

 

-         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!  

 

User Outln

 

-         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  

 

Einschränkungen

 

-         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)

Outlines in TuTool

 

Das Tool bietet Möglichkeiten an, die Stored Outlines für einzelne SQL’s zu verwalten.

Data Dictionary Views

 

-         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

 

Packages

 

-         DBMS_OUTLN

-         DBMS_OUTLN_EDIT

 

 

Sicherung und Wiederherstellung von Outlines

Mit Export / Import

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

Durch Änderung der Kategorie

Dafür kann man das Kommando "alter outline <outline name> change category to <category name>" benutzen.

 

Wie kann man mit ORADEBUG feststellen, dass eine Outline Kategorie in einer Session (oder systemweit) eingeschaltet ist

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.