Looking at the blocked sessions, a query similar to this was a common theme:
UPDATE foo
SET foo_data = :data, foo_time = systimestamp
WHERE foo_id = :id
This statement was run by many sessions from our webservers as part of a page load process. Very high-frequency call rate. We knew that the only change in the database was the minimal supplemental logging. Obviously we were preparing to turn it off, but took some time to look into it. It is important to note that for the most part the contention was only with sessions running this update statement.
Looking at the table involved, one unique feature was that foo_data field is an encrypted CLOB, which Oracle refers to as a securefile in 11g.
SQL> desc foo
Name Null? Type
--------------- -------- ----------------------------
FOO_ID NOT NULL VARCHAR2(64)
FOO_DATA CLOB ENCRYPT
FOO_TIME NOT NULL TIMESTAMP(6)
We opened an SR with Oracle and they pointed us to this unpublished bug:
Bug 9351684 : SECUREFILE - CACHE NOLOGGING CAUSES HIGH WRITE COMPLETE WAITS
They described it for us as:
Confirmed as "not a bug" in this bug.Basically telling us that this is working as intended and there is no workaround if you're using securefiles. For us it was important that we move forward with Golden Gate, so we would need to have a solution that let us keep minimal supplemental logging on. Looking closer, we knew that this table was on an encrypted tablespace already, so we felt comfortable changing the table so that it used a regular "basicfile" CLOB:
It was stated: "write complete waits in this case are unfortunately, expected and can not be avoided/tuned. Even for NOLOGGING case there is a short invalidation redo that must be generated, and for correct crash recovery, dbwr must wait for redo to be written to disk first before data blocks can be written."
SQL> desc foo
Name Null? Type
--------------- -------- ----------------------------
FOO_ID NOT NULL VARCHAR2(64)
FOO_DATA CLOB
FOO_TIME NOT NULL TIMESTAMP(6)
Since making this change, the problems have gone away. Obviously we were lucky in that we could change the table to not use securefiles. If you have a table that sees a lot of DML with securefiles, you're probably going to have a painful experience with supplemental logging. Beware!