2013-12-02 4 views

ответ

6

Во-первых, архитектурно, я бы очень подозрительны любого дизайна, который участвует вытягивать данные по нескольким линиям связи с базами данных. Я видел это, когда конечным источником является некоторая древняя версия Oracle, с которой целевая база данных не может напрямую подключаться, поэтому использовалась промежуточная база данных с промежуточной версией Oracle. Однако на практике это очень редко.

С точки зрения производительности такой подход является серьезной проблемой. Разумеется, есть проблема, что данные будут отправляться по сети дважды. Но более тревожно, вы занимаетесь сложной проблемой, оптимизируя распределенные SQL-запросы и делаете ее почти неразрешимой. В основном вы должны либо гарантировать, что вы никогда не будете запрашивать локальные данные и удаленные данные в одном запросе, или вам придется жить с полученной производительностью, если Oracle решит тупой план запроса, потому что набор инструментов, оставшихся для вас, оптимизировать такой запрос минимально.

Это означает, что промежуточная база данных должна иметь синонимы или представления, абстрагирующие от ссылки на базу данных. Так

На A:

  • создать ссылку базы данных B

На B:

  • создать базу данных ссылка на C
  • создать синоним table для [email protected]

На А, вы можете

SELECT * 
    FROM [email protected] 
+0

JustinCave спасибо за быстрый ответ. На моем DATA_WAREHOUSE у нас есть такие синонимы, но я пытаюсь выполнить что-то вроде: 'declare v_ddl clob; V_DDL_PART varchar2 (4000); begin для I in 0 .. 50 loop выберите [email protected]_link ([email protected]_link ('TABLE', 'MYTABLE'), (4000 * I + 1)) в V_DDL_PART из dual @ db_link; V_DDL: = V_DDL || V_DDL_PART; контур конца; end; 'Но теперь я могу видеть только эти синонимы, но я хочу прочитать определение источника во второй базе данных. – WBAR

+1

@WBAR - ОК. Поэтому проблема заключается не в том, что вы не можете ссылаться на таблицы на 'C' из' A'. Проблема в том, что вы не можете вызывать хранимые процедуры на 'C' из' A'. Вам нужно будет создать процедуры обертки в 'B', которые вызывают пакет' dbms_metadata' на 'C'. Я не знаю, как это сделать, используя синонимы, хотя такой подход вполне может существовать. –

Смежные вопросы