Я хочу получить все определения таблицы для всех моих таблиц. И я хочу сделать это быстро (это часть script, что я бегу много)
Я использую oracle 11g, и у меня есть 700 таблиц. На простой код jdbc требуется 4 минуты и делает:
s = con.statement("select DBMS_METADATA.GET_DDL(object_type,object_name) from user_objects where object_type = 'TABLE');
s.execute();
rs = s.getResultSet();
while(rs.next()){
rs.getString(1);
}
SO Я хочу оптимизировать этот код и достичь около 20 секунд.
Я уже достиг 40-50 секунд, создав 14 потоков, каждый из которых открывает соединение с базой данных и считывает часть информации, используя mod на rownum.
Но этого недостаточно.
Я думаю в этих направлениях:
http://docs.oracle.com/cd/B10501_01/java.920/a96654/connpoca.htm#1063660 - кеширование соединений. может ли это ускорить работу, заменив мои 14 соединений на connectionCaching?
Можно ли сохранить доступ к таблицам этой функцией в области кеша кеша KEEP?
В любом случае, чтобы проиндексировать часть информации здесь?
Приветствуются любые другие предложения.
Спасибо
Я боюсь, что сделать это быстрее нелегко. Вся вещь GET_DDL реализована в Java и использует преобразование XSLT как часть процесса генерации.
Возможно, вы найдете это быстрее. http://metacpan.org/pod/DDL::Oracle
EXP FULL=YES ROWS=NO
: EXP FULL=YES ROWS=NO
а затем IMP SHOW=YES
. Затем я обрабатываю вывод из imp через скрипт perl ручной работы.
Требуется ли всегда получать DDL, даже если таблицы не были изменены? В противном случае получите только DDL из тех таблиц, где ALL_OBJECTS.LAST_DDL_TIME изменился с момента последнего получения.
Другой вариант - написать свой собственный GET_DDL таким образом, чтобы он мог получить сразу несколько таблиц.
В первую очередь я хотел бы предложить HAL только для внесения изменений, но я бы также посмотрел на устранение любых параметров, которые мне не нужны - например, предложения STORAGE?