Есть две вещи, которые следует учитывать при попытке ускорить это:
- Выполнить этот запрос только один раз для всех листов
- Убедитесь, что вы выполняете один и тот же запрос каждый раз,не жестко кодируя значения в. Поскольку эти значения могут изменяться, каждый запрос будет выглядеть как предыдущий, но только с несколькими различными значениями.Это не позволит Oracle повторно использовать предыдущий запрос и приведет к невозможности совместного использования SQL в общем пуле.Это заполнит общий пул.Делайте это достаточно долго, и вы получите сообщения об ошибках ORA-04031.
Способ заключается в использовании типов SQL.Вот пример в PL / SQL.Вы можете использовать тот же принцип в Java.
Сначала создайте таблицу с десятью тысячами ID листа:
SQL> create table worksheet (sheetid)
2 as
3 select level
4 from dual
5 connect by level <= 10000
6 /
Table created.
Создайте тип SQL:
SQL> create type mynumbers is table of number;
2 /
Type created.
В вашем кодезаполните экземпляр типа SQL значениями в вашем "valuelist" и используйте оператор TABLE для преобразования типа в значения таблицы:
SQL> declare
2 valuelist mynumbers := mynumbers(23,124,987,6123,8923,1,7139);
3 begin
4 for r in
5 ( select ws.sheetid
6 from worksheet ws
7 , table(valuelist) vl
8 where ws.sheetid = vl.column_value
9 )
10 loop
11 dbms_output.put_line(r.sheetid);
12 end loop;
13 end;
14 /
1
23
124
987
6123
7139
8923
PL/SQL procedure successfully completed.
Теперь у вас есть только один SQL в вашем общем пуле и простоодно выполнение этого запроса вместо тысяч.