Beginnend mit Oracle 18.4 gibt es einen BUG das Oracle bei Statements die Views, Joins und Group by enthalten, einen der folgenden ORA-00600 liefert:
- ORA-00600 [qesrAddRowFromOrig:row_ix]
- ORA-00600 [qesrCopyOrigRowsetOpns:cnt]
Analyse
Der Fehler wird im der MOS Note Bug 30577100 - SQL Statement Involving Views, Joins and Group by Fails With ORA-00600 [qesrAddRowFromOrig:row_ix] (Doc ID 30577100.8) behandelt. Der Fehler ist erst ab 20.2 - somit ab Oracle 21c - behoben.
Workaround für den Bug
Der Workaround ist, in den Sessions, die davon betroffen sind, undokumentierte Parameter zu aktivieren. Dabei gibt es aber drei mögliche Varianten, je nachdem ob das Problem durch einen Hash Join, ein Rowset oder das Group By entsteht.
Detailanalyse des Fehlers
Auf Grund der Tracefiles zum ORA-00600 haben wir festgestellt, dass dieser nur in Sessions passiert, die mit APEX zu tun haben und vom Server apexserver.example.com gekommen sind. Damit die restlichen Datenbank Sessions auch weiterhin ohne setzen der undokumentierten Parameter funktionieren, wurde folgender Datenbank Logon Trigger implementiert. Im Anschluss wurde getestet, welche Kombination von undokumentierten Parametern den Fehler verschwinden lässt. Im Trigger ist auch die Information, welche Einstellungen bei welcher Variation den Bugs zu setzen sind, enthalten.
Beispiel Logon Trigger mit Workaround
CREATE OR REPLACE TRIGGER LOGON_BUG_WORKAROUND
AFTER LOGON ON DATABASE
BEGIN
FOR x IN (SELECT machine FROM SYS.v_$session WHERE audsid = USERENV ('sessionid'))
LOOP
IF trim(x.machine) = 'apexserver.example.com'
THEN
/* Enable Workaround for BUG 30577100 SQL Statement Involving Views, Joins and Group by Fails With ORA-00600
found problem: [qesrCopyOrigRowsetOpns:cnt] --> ROWSETs
Disable encoding-aware hash join: "_sqlexec_encoding_aware_hj_enabled" = false
or
Disable rowsets: "_rowsets_enabled" = false;
or
Disable group by placement and/or disable group by elimination
"_optimizer_group_by_placement" = false;
"_optimizer_aggr_groupby_elim" = false; */
EXECUTE IMMEDIATE 'alter session set "_rowsets_enabled"=false';
END IF;
END LOOP;
END;
/