Audit select queries against specified tables by specified users
I have found a way to prevent duplicate rows in FGA audit trail with parallel query

First create a function that return 1 if AUTHENTICATION_METHOD is PQ_SLAVE in USERENV context (coordinator process gets 0)

create or replace function is_pg_slave return integer as
begin
  if (sys_context('USERENV', 'AUTHENTICATION_METHOD') = 'PQ_SLAVE') then
    return 1;
  else 
    return 0;
  end if;
end;
/


Then add policy to table

begin
      dbms_fga.add_policy(
        object_name       =&gt; 'table_name',
        policy_name       =&gt; 'noaudit_pq_slave',
        audit_condition   =&gt; 'is_pg_slave = 0',
        statement_types   =&gt; 'SELECT');
end;
/


Now only the query coordinator is audited, so no matter what the parallel degree is, only one row is inserted into fga audit trail.

I have not noticed any performance issues with this approach compared to normal auditing or no auditing.