Dienstag, März 06, 2012

SQL Patch

Im Blog der CBO-Entwickler fanden sich in jüngerer Vergangenheit zwei Beiträge zum Thema des Hints BIND_AWARE:
  • How do I force a query to use bind-aware cursor sharing? führt die Verwendung des Hints anhand von Beispielfällen vor
  • Using SQL Patch to add hints to a packaged application zeigt, wie man den BIND_AWARE-Hint mit Hilfe der Funktion SYS.DBMS_SQLDIAG_INTERNAL.I_CREATE_PATCH in ein SQL Patch-Objekt einfügen kann. Dabei scheint ein SQL Patch eine weitere Variante zu den bekannten Plan Management-Optionen (sql profile, outline, sql baseline) zu sein - jedenfalls erscheint in der Note-Sektion det dbms_xplan.display-Ausgabe ein ähnlicher Hinweis wie für die anderen Verfahren ("SQL Patch "xyz" used for this statement").
Beide Artikel riefen Nachfragen hervor, ob dieses - weitgehend undokumentierte - Feature überhaupt offiziell supported sei und wie die Lizenzierung für die Verwendung der SQL Patch-Funktionalität aussähe. In Reaktion auf diese Fragen, wurde ein weiterer Artikel veröffentlicht:
  • Additional Information on SQL Patches: darin wird darauf hingewiesen, dass SQL Patch in den Zusammenhang des SQL Repair Advisor gehört und keine besondere Lizenzierung erfordert. Außerdem wird erklärt, dass die zugehörige API nur einen SQL_TEXT und keine SQL_ID übernehmen kann.
Weitere erläuternde Beiträge zum Thema sind angekündigt.

Dom Brooks hat zum Thema in seinem Blog einen umfangreicheren Kommentar geschrieben, der unter anderem darauf hinweist, dass eine deutliche Abgrenzung von SQL Patch und SQL Baseline noch fehlt (und auch, dass die Frage des offiziellen Supports nicht endgültig beantwortet ist). In einem zweiten Artikel liefert der Herr Brooks diese Information dann selbst nach und erklärt:
SQL Baselines exist to reproduce a specific plan. In fact, a plan hash exists as part of the baseline. If, on application of the baseline, the Optimizer is unable to reproduce the desired plan, the baseline is rejected outright. On the other hand, SQL Patches have been developed primarily to get the Optimizer to avoid a particular problem path in an execution plan, specifically to avoid failures due to certain access methods, join methods, etc.
Außerdem zeigt er auch noch anhand von SYS.SQLOBJ$, SYS.SQLOBJ$DATA und SYS.SQLOBJ$AUXDATA die unterschiedliche interne Darstellung der beiden Verfahren. Enthalten sind auch noch diverse sehr übersichtliche Code-Stücke zur Anlage der fraglichen Objekte zur Plan-Stabilisierung bzw. -Beeinflussung.

Nachtrag 01.04.2012: inzwischen hat Dom Brooks noch zwei weitere Artikel veröffentlicht:
  • SQL Patch III / Parallel Baselines: zeigt, dass man mehrere Hints in einem SQL Patch unterbringen kann und dass man damit auch einen parallel Hint einbauen kann (was bei Baselines anscheinend nicht so recht funktioniert).
  • SQL Patch IV – Why is the SQL Patch applied but not effective?: zeigt, dass auch dann, wenn ein SQL Patch verwendet wird, nicht sichergestellt ist, dass die enthaltenen Hints verwendet wird; man muss in diesem Fall sehr genau auf die hint specification achten und darin die komplette query block Benamung einbauen.

Keine Kommentare:

Kommentar veröffentlichen