They'll use up some dictionary cache, and it would follow that 10,000+ sequences will lead to 10,000+ (or more) different SQL statements that use them. That could have a hefty impact on parsing.
So you could test for impact by keeping an eye on the parsing stats in AWR reports and the like. If it hurts, then consider a home-grown solution that mimics sequences but is customised for you eg,
SQL> create table my_sequences (
2 prod varchar2(10),
3 cust varchar2(10),
4 year int,
5 seq int ,
6 constraint my_sequences_pk primary key (prod,cust,year,seq)
7 )
8 organization index;
Table created.
SQL>
SQL>
SQL>
SQL> create or replace
2 function seqval(p_prod varchar2,p_cust varchar2,p_year int) return int is
3 l_seq int;
4 begin
5 update my_Sequences
6 set seq = seq + 1
7 where prod = p_prod
8 and cust = p_cust
9 and year = p_year
10 returning seq into l_seq;
11
12 if sql%notfound then
13 insert into my_sequences (prod,cust,year,seq)
14 values (p_prod,p_cust,p_year,0)
15 returning seq into l_seq;
16 end if;
17
18 return l_seq;
19 end;
20 /
Function created.
SQL>
SQL> set serverout on
SQL> exec dbms_output.put_line(seqval('P1','C1',2016));
0
PL/SQL procedure successfully completed.
SQL> exec dbms_output.put_line(seqval('P1','C1',2016));
1
PL/SQL procedure successfully completed.
SQL> exec dbms_output.put_line(seqval('P1','C1',2016));
2
PL/SQL procedure successfully completed.
SQL>
SQL> exec dbms_output.put_line(seqval('P1','C2',2016));
0
PL/SQL procedure successfully completed.
SQL> exec dbms_output.put_line(seqval('P1','C2',2016));
1
PL/SQL procedure successfully completed.
SQL> exec dbms_output.put_line(seqval('P1','C2',2016));
2
PL/SQL procedure successfully completed.
SQL>
SQL> select * from my_sequences;
PROD CUST YEAR SEQ
---------- ---------- ---------- ----------
P1 C1 2016 2
P1 C2 2016 2
2 rows selected.
SQL>
SQL>