Oracle Query on Pipelined работает нормально, но не работает, если я добавлю условие - PullRequest
4 голосов
/ 14 марта 2012

У меня есть функции pipelind, которые возвращают коллекцию пользовательских объектов, то есть вложенную таблицу.

Это прекрасно работает (<4 секунды), когда я выбираю из него вот так; </p>

select e.* from table(MY_PIPLINED_FUNCTION)e

Но когда я добавляю любое условие (кроме where rownum<X), для выполнения запроса требуется вечность (например, 5+ минут), но он действительно возвращает нужное значение в конце .

Что меня поражает, так это то, что работает, но для его завершения требуется огромное количество времени.

У кого-нибудь есть идеи по этому поводу?

p.s.: это большой набор результатов, как по количеству строк (30K +), так и по количеству столбцов (50 + столбцов).

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Сравниваете ли вы время, чтобы получить весь набор результатов? Или только первые N строк?

Ваш предикат отфильтровывает 99% данных, заставляя один запрос работать намного сложнее, чтобы получить эти N строк?

Конвейерная функция может не иметь к этому никакого отношения. Вы можете использовать конвейерную функцию и по-прежнему извлекать первые N строк, не оценивая весь набор результатов. Например, приведенный ниже бесконечный цикл быстро вернет результаты в среде IDE, которая извлекает только небольшое количество строк.

create or replace type number_nt as table of number;

create or replace function pipe_function return number_nt pipelined is
begin
    while 1 = 1 loop
        pipe row(1);
    end loop;
end;
/

select column_value
from table(pipe_function)
where column_value < 2;

Возможно, вам потребуется добавить больше информации о вашей функции и предикате.

1 голос
/ 14 марта 2012

Получает полный набор результатов для применения фильтров.

Вы должны улучшить MY_PIPLINED_FUNCTION. Вероятно, теперь он использует индексы, и поэтому first_rows приходит быстро.

1.Вы можете попытаться заставить его использовать хэш для объединений (это может привести к полному набору результатов за меньшее время, но первые строки не появятся быстро)

2.Вы можете изменить функцию и поместить условия в аргументы функции, соответственно изменив функцию - отфильтровав строки из определенной таблицы. (Т.е. вместо

select e.* from table(MY_PIPLINED_FUNCTION)e 
where e.name = 'mark'

сделать

select e.* from table(MY_PIPLINED_FUNCTION('mark'))e 

)

Эти вещи могут помочь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...