Trying the update first, then doing the insert if SQL%ROWCOUNT is 0, seems to be a bit faster for heavy update cases, but still significantly slower than the same logic for heavy insert cases. I can't figure out why this is.