Is that what passes for a real test nowadays, then? I think not. Don't show me a 0.03 sec walltime difference on a constraint violation inserting into a twenty row table, then extrapolate it it to 10 million rows, do a real test. Are you teling me that an application is going to try inserting 10 million rows PK values, all the same, into a twenty row table?

If it makes logical sense for the PK to be numeric, store it as numeric. If it needs to be varchar2, then store it as that.