На фронте Oracle я бы выбрал вариант 1. Сортировка.
У меня будет уникальный индекс, обеспечивающий наличие только одной записи по умолчанию для каждого пользователя, тогда я буду использовать функцию в этом индексе как часть обновления. Вы обновляете только те строки, которые нужно обновить. Кроме того, уникальный индекс минимизирует работу, необходимую для получения электронной почты по умолчанию для данного пользователя, не только для обновления, но и везде, где вы используете эту функцию для получения строки.
drop table user_email;
create table user_email
(userid varchar2(4) not null, default_ind varchar2(1) not null,
email varchar2(30));
create unique index ue_x on user_email
(userid, decode(default_ind,'Y','Y',email));
insert into user_email (userid, default_ind, email) values ('fred','N','a');
insert into user_email (userid, default_ind, email) values ('fred','N','b');
insert into user_email (userid, default_ind, email) values ('fred','Y','c');
update user_email
set default_ind = 'N'
where userid = 'fred'
and decode(default_ind,'Y','Y',email) = 'Y';
update user_email
set default_ind = 'Y'
where userid = 'fred'
and email = 'a';
PS. «Накладные расходы на проверку по умолчанию = 'Y'» довольно незначительны, так как вам все равно необходим доступ к этому столбцу для его обновления.