Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 запрос к таблицам из разных БД  [new]
reaque
Member

Откуда:
Сообщений: 81
В бд1 есть таблица1
В бд2 есть таблица2

запрос из первой БД работает быстро
автор
select * from таблица1 where id in (select id from таблица2@бд2)


аналогичный запрос из второй БД работает бесконечно медленно
автор
select * from таблица1@бд1 where id in (select id from таблица2)


при этом на второй БД подзапрос выполняется мгновенно
автор
select id from таблица2


если на второй БД вместо подзапроса указать конкретные значения (результат подзапроса) - запрос выполнится мгновенно.
автор
select * from таблица1@бд1 where id in (1,2,3)


куда копать?
11 июн 19, 13:07    [21906633]     Ответить | Цитировать Сообщить модератору
 Re: запрос к таблицам из разных БД  [new]
oragraf
Member

Откуда: Moscow
Сообщений: 1211
reaque,

driving_site?
11 июн 19, 13:16    [21906651]     Ответить | Цитировать Сообщить модератору
 Re: запрос к таблицам из разных БД  [new]
reaque
Member

Откуда:
Сообщений: 81
Спасибо, проблему решило
автор
select /*+ DRIVING_SITE(таблица1) */ * from таблица1@бд1 where id in (select id from таблица2)


Если раньше этот запрос работал быстро и без хинта, что могло повлиять, если структура объектов в запросе не менялась?
11 июн 19, 13:44    [21906687]     Ответить | Цитировать Сообщить модератору
 Re: запрос к таблицам из разных БД  [new]
reaque
Member

Откуда:
Сообщений: 81
Если результат запроса необходимо сохранить в какую таблицу через insert into, то запрос вновь бесконечно долго выполняется.

Похожая проблема обсуждалась тут: https://www.sql.ru/forum/146331/driving-site-insert
Но решения нет.
13 июн 19, 09:32    [21907687]     Ответить | Цитировать Сообщить модератору
 Re: запрос к таблицам из разных БД  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6710
reaque
Если результат запроса необходимо сохранить в какую таблицу через insert into, то запрос вновь бесконечно долго выполняется

данных много для вставки?
13 июн 19, 09:42    [21907693]     Ответить | Цитировать Сообщить модератору
 Re: запрос к таблицам из разных БД  [new]
reaque
Member

Откуда:
Сообщений: 81
Запрос выдает 0 строк, так задумано, т.е. вставлять по идее нечего.
Тут на форуме прочитал, что когда идет DML операция (в данном случае INSERT), то хинт в подзапросе не работает.

Еще уточнение: таблица1 это не таблица, а представление.
Если сделать create table MyTable1 as select * from "указанное представление", а в запросе прописать вместо представления созданную таблицу - запрос работает быстро. Созданная таблица на несколько миллионов строк, без индексов.
13 июн 19, 11:03    [21907748]     Ответить | Цитировать Сообщить модератору
 Re: запрос к таблицам из разных БД  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6710
reaque
Запрос выдает 0 строк, так задумано, т.е. вставлять по идее нечего.
Тут на форуме прочитал, что когда идет DML операция (в данном случае INSERT), то хинт в подзапросе не работает.

Еще уточнение: таблица1 это не таблица, а представление.
Если сделать create table MyTable1 as select * from "указанное представление", а в запросе прописать вместо представления созданную таблицу - запрос работает быстро. Созданная таблица на несколько миллионов строк, без индексов.

Попробуйте, напишите например функцию, которая будет возвращать коллекцию элементов, если элементов > 0, то сделать вставку из коллекции. Пусть запрос делается "там" внутри функции, а вставка, если есть что вставлять, "здесь"
13 июн 19, 11:38    [21907774]     Ответить | Цитировать Сообщить модератору
 Re: запрос к таблицам из разных БД  [new]
reaque
Member

Откуда:
Сообщений: 81
Еще уточнение:
если вместо представления указать текст запроса представления - все работает быстро.
13 июн 19, 12:50    [21907850]     Ответить | Цитировать Сообщить модератору
 Re: запрос к таблицам из разных БД  [new]
xtender
Member

Откуда: Мск
Сообщений: 5216
reaque,

https://www.freelists.org/post/oracle-l/plan-shows-insert-into-remote-table-using-all-remote-selects,1
Jonatahn Lewis
You can't.

The query that supplies data to the insert has to be executed by the database
where the DML is taking place - which means the remote (to you) database. The
plan you see is the plan from the perspective of the remote (to you) database,
which is why it reports the table which you think of as local as being remote
(to the executing session).

If you want a plan which does ALL the work at the local (to you) database you
need to create a local (to you) view for the query (possibly with a no_merge
hint) and the do "insert into remote_table select * from local_view". You
might, however, manage to get away with creating a set of hints on the query
that force a nested loop join all the way through every table, then the plan
would be (just like operation 22 in the current plan) just "REMOTE", with the
join query being reported as the remote SQL.

Alternatively you could create a pipelined function that returns the data you
want and "insert ... select from pipelined function"
https://jonathanlewis.wordpress.com/2010/10/07/distributed-pipelines/


Regards
Jonathan Lewis
13 июн 19, 13:03    [21907878]     Ответить | Цитировать Сообщить модератору
 Re: запрос к таблицам из разных БД  [new]
reaque
Member

Откуда:
Сообщений: 81
Решение: создали представление на локальной базе, в тексте запроса которого идет обращение к таблицам удаленной БД. Пока работает.
14 июн 19, 14:15    [21908700]     Ответить | Цитировать Сообщить модератору
 Re: запрос к таблицам из разных БД  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6710
reaque
если вместо представления указать текст запроса представления - все работает быстро.

reaque
Решение: создали представление на локальной базе,

ну... что сказать...
14 июн 19, 14:56    [21908744]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить