Verwirrung um ISDEFAULT in v$parameter

In der Data Dictionary-View „v$parameter“ sind die Einstellungen der Instanz-Parameter hinterlegt. Da diese Parameter nicht nur in den Konfigurationsdateien (init.ora oder SPFile) sondern auch in der laufenden Instanz oder in einzelnen Sessions geändert werden können, ist diese View der erste Anlaufpunkt, wenn man sich einen Überblick über die aktuellen Einstellungen verschaffen will.

Allerdings sind die Spalten dieser View nicht mit Kommentaren versehen, und ihre Namen können irreführend sein, wie im Fall der Spalte „isdefault“:

Von einer Spalte namens „isdefault“ könnte man annehmen, daß sie angibt, ob der betreffende Parameter der „Werkseinstellung“ entspricht oder nicht. Dann passt aber etwas bei dem folgenden Beispiel nicht:

SQL> col name for a20
SQL> col value for a20
SQL> select name, value, isdefault
  2    from v$parameter
  3   where name like 'cursor_sh%';

NAME                 VALUE                ISDEFAULT
-------------------- -------------------- ---------
cursor_sharing       FORCE                TRUE

SQL> alter system set cursor_sharing='EXACT' scope=both;
System wurde geändert.

SQL> select name, value, isdefault
  2    from v$parameter
  3   where name like 'cursor_sh%';

NAME                 VALUE                ISDEFAULT
-------------------- -------------------- ---------
cursor_sharing       EXACT                TRUE

Der Parameter „cursor_sharing“ wurde geändert, und zwar für die ganze laufende Instanz sowie im SPFile (scope=both), sodaß die Einstellung auch beim nächsten Start erhalten bleibt. Dennoch zeigt die Spalte „isdefault“ den Wert „TRUE“ in beiden Fällen — müsste er nicht nur in einem der beiden (und zwar bei „exact“) „TRUE“ sein?

Ein Blick in die Oracle-Doku zeigt folgendes:

ISDEFAULT: Zeigt an, ob der Parameter auf die Voreinstellung gesetzt oder in der Parameter-Datei spezifiziert wurde.

Das heißt also, daß man über die Spalte „isdefault“ gar nicht herausfinden kann, ob der Parameter von den Voreinstellungen abweicht, sondern nur, ob er beim Start der Instanz in der Parameter-Datei stand!

Über v$parameter kann man tatsächlich nur herausfinden, ob ein Parameter seit Start der Instanz überhaupt geändert wurde. Dies geht über die Spalte „ISMODIFIED“, die folgende Werte enthalten kann:

  • FALSE — Der Parameter wurde noch nicht geändert.
  • MODIFIED — Der Parameter wurde mit ALTER SESSION geändert.
  • SYSTEM_MOD — Der Parameter wurde mit ALTER SYSTEM geändert.

Unser Beispiel von oben wird fortgesetzt:

  1  select name, value, isdefault, ismodified
  2    from v$parameter
  3*  where name like 'cursor_sh%'
SQL> /

NAME                 VALUE                ISDEFAULT ISMODIFIED
-------------------- -------------------- --------- ----------
cursor_sharing       EXACT                TRUE      SYSTEM_MOD

SQL> alter session set cursor_sharing='FORCE';

Session wurde geändert.

SQL> select name, value, isdefault, ismodified
  2    from v$parameter
  3   where name like 'cursor_sh%'
  4  /

NAME                 VALUE                ISDEFAULT ISMODIFIED
-------------------- -------------------- --------- ----------
cursor_sharing       FORCE                TRUE      MODIFIED

Fazit: Die einzig verlässliche Quelle zu den Voreinstellungen ist immer noch die Dokumentation.

Übrigens: In der Oracle-Doku der Version 9i war die Bedeutung dieser Spalte noch nicht so deutlich formuliert.

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s