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

Откуда: Питер->Москва
Сообщений: 438
День добрый.
Ситуация следующая:
Oracle 10.2.0.2.0
В схеме есть пакет в котором находится функция возвращающая результат статического запроса в виде nested table типа, объявленного в этом же пакете. Существует еще одна база. Из второй базы существует dblink в первую. Проблема в том, что при вызове этой функции через dblink план запроса очень сильно отличается (в худшую сторону) от плана при вызове этой функции локально. Т.е. для двух вызовов имеем один sql_id но с разными child_number. Dblink настроен на владельца пакета; локально функция вызывалась также из-под него.
Вопрос: как узнать из-за чего это происходит? v$sql_shared_cursor отличий не выявил.
25 апр 07, 10:30    [4066518]     Ответить | Цитировать Сообщить модератору
 Re: Отличие плана при вызове через dblink  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18373
Так происходит из-за сущности dblink - в общем случае это канал к удаленной бд.
25 апр 07, 10:33    [4066540]     Ответить | Цитировать Сообщить модератору
 Re: Отличие плана при вызове через dblink  [new]
Goster
Member

Откуда: Питер->Москва
Сообщений: 438
andrey_anonymous
Так происходит из-за сущности dblink - в общем случае это канал к удаленной бд.

Поясните, пожалуста.
25 апр 07, 10:39    [4066577]     Ответить | Цитировать Сообщить модератору
 Re: Отличие плана при вызове через dblink  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18373
Goster
Поясните, пожалуста.

В процессе принимает участие более одной SQL-машины, каждой из которых доступна лишь часть необходимых для выполнения запроса данных. Оптимизатору приходится организовывать взаимодействие между ними - решать, какой экземпляр будет "главным" (т.е. формировать итоговый resultset), какие данные куда придется прокачивать и где фильтровать.
При этом план исполнения, разумеется, ни разу не будет похож на своего локального "коллегу".
25 апр 07, 10:45    [4066629]     Ответить | Цитировать Сообщить модератору
 Re: Отличие плана при вызове через dblink  [new]
Goster
Member

Откуда: Питер->Москва
Сообщений: 438
Безусловно, Вы правы. Но в данном случае ситуация иная. Выполнение запроса происходит на одном из серверов. Удаленно вызывается не запрос, а только функция. Функция же исполняет запрос целиком локально.
25 апр 07, 11:07    [4066824]     Ответить | Цитировать Сообщить модератору
 Re: Отличие плана при вызове через dblink  [new]
givanov
Member

Откуда:
Сообщений: 757
Продемонстрируйте код и планы. Пока не совсем понятно, почему бы им различаться.
25 апр 07, 11:11    [4066867]     Ответить | Цитировать Сообщить модератору
 Re: Отличие плана при вызове через dblink  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18373
Goster
Безусловно, Вы правы. Но в данном случае ситуация иная. Выполнение запроса происходит на одном из серверов. Удаленно вызывается не запрос, а только функция. Функция же исполняет запрос целиком локально.

Функция в запросе? В select-list, where?
Может, это pipelined и поминается во from?
Или это пользовательская агрегатная функция?
Если Вы хотите разбираться предметно - общих слов явно недостаточно.
Подробно опишите то, что считаете проблемой, покажите запросы, планы, статистику и т.д. - т.е. сделайте внятный testcase.
25 апр 07, 11:15    [4066908]     Ответить | Цитировать Сообщить модератору
 Re: Отличие плана при вызове через dblink  [new]
MacDuck
Member

Откуда: Москва-Подольск
Сообщений: 6387
Goster
а только функция. Функция же исполняет запрос целиком локально.


А в чем прикол? Зачем так хитрО?
25 апр 07, 11:24    [4066992]     Ответить | Цитировать Сообщить модератору
 Re: Отличие плана при вызове через dblink  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18373
MacDuck
Goster
а только функция. Функция же исполняет запрос целиком локально.
А в чем прикол? Зачем так хитрО?

Дим, не подменяй тему - обсуждаем особенности oracle, а не конкретного дизайна :)
25 апр 07, 11:26    [4067001]     Ответить | Цитировать Сообщить модератору
 Re: Отличие плана при вызове через dblink  [new]
Goster
Member

Откуда: Питер->Москва
Сообщений: 438
givanov
Продемонстрируйте код и планы. Пока не совсем понятно, почему бы им различаться.

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

andrey_anonymous

Функция в запросе? В select-list, where?
Может, это pipelined и поминается во from?
Или это пользовательская агрегатная функция?
Если Вы хотите разбираться предметно - общих слов явно недостаточно.
Подробно опишите то, что считаете проблемой, покажите запросы, планы, статистику и т.д. - т.е. сделайте внятный testcase.


Тип и функция выглядят приблизительно так:

TYPE TREC IS RECORD(
col1 VARCHAR2(256),
col2 VARCHAR2(256));

TYPE TTAB IS TABLE OF TREC;

function FNCTN(param in date) return TTAB is
 retval TTAB;
 cursor cur is
 ......
begin
 open cur;
 fetch cur bulk collect into TTAB;
 close cur;
 return retval;
end;
Соответственно вызывается это подобным кодом:
declare
  vr TTAB;
begin
  vr := FNCTN(1);
end;

Проблемой я сичтаю, что при выполнении этого кода с удаленной машины план запроса из функции сильно отличается от плана при выполнении локально. Вопрос состоит в том, из-за чего это может происходить? Запросы, планы и тд. приводить не буду из-за их довольно значительного размера.
25 апр 07, 11:53    [4067302]     Ответить | Цитировать Сообщить модератору
 Re: Отличие плана при вызове через dblink  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18373
Goster
Проблемой я сичтаю, что при выполнении этого кода с удаленной машины план запроса из функции сильно отличается от плана при выполнении локально. Вопрос состоит в том, из-за чего это может происходить?

Что-то никто не прореагировал :)
Поскольку запрос в обозначенном сценарии предположительно выполняется локально на удаленной БД, то причиной различия планов может быть разница в параметрах сессий, с которыми заходит локальный пользователь и пользователь удаленной БД - от NLS_* до optimizer*.
27 апр 07, 12:27    [4078525]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить