Оптимизирующий запрос: DBMS_METADATA.GET_DDL (Oracle)

2

Я хочу получить все определения таблицы для всех моих таблиц. И я хочу сделать это быстро (это часть 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?

  • В любом случае, чтобы проиндексировать часть информации здесь?

  • Приветствуются любые другие предложения.

Спасибо

  • 0
    Это похоже на вопрос, который вы бы задали, только если вы не используете контроль версий. Если это так, то реальный ответ: используйте контроль версий.
Теги:
jdbc

3 ответа

1
Лучший ответ

Я боюсь, что сделать это быстрее нелегко. Вся вещь GET_DDL реализована в Java и использует преобразование XSLT как часть процесса генерации.

Возможно, вы найдете это быстрее. http://metacpan.org/pod/DDL::Oracle

  • 3
    Я бы очень, очень осторожно предлагал сторонние инструменты для этой задачи - особенно те, которые, очевидно, не обновлялись в течение нескольких лет (так что, конечно, они не будут поддерживать новые функции, такие как значения столбцов по умолчанию с использованием последовательностей и т. Д.)
  • 3
    Да, ты прав. С другой стороны, DBMS_METADATA также имеет (или имела) свои ошибки, а также не работает в редакциях XE. Он не работает на любой другой установке базы данных, где отсутствует JVM. Другой способ, которым я EXP FULL=YES ROWS=NO : EXP FULL=YES ROWS=NO а затем IMP SHOW=YES . Затем я обрабатываю вывод из imp через скрипт perl ручной работы.
Показать ещё 1 комментарий
5

Требуется ли всегда получать DDL, даже если таблицы не были изменены? В противном случае получите только DDL из тех таблиц, где ALL_OBJECTS.LAST_DDL_TIME изменился с момента последнего получения.

Другой вариант - написать свой собственный GET_DDL таким образом, чтобы он мог получить сразу несколько таблиц.

1

В первую очередь я хотел бы предложить HAL только для внесения изменений, но я бы также посмотрел на устранение любых параметров, которые мне не нужны - например, предложения STORAGE?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню