powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование самописных фунциях в запросах и скорость
18 сообщений из 18, страница 1 из 1
Использование самописных фунциях в запросах и скорость
    #32162662
chp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос к специалистам.
У меня есть пакет в котором описано несколько функции, достаточно простых
выполняю запрос примерно такого вида:
/***********************************************/
select name, MY_FUNC.GetAccount(name) from NameTable
where
name like MY_FUNC.GetNameMask();
/***********************************************/
поле name - проиндексировано
MY_FUNC.GetAccount(name) - возвращает счет по имени клиента,
MY_FUNC.GetNameMask() - возвращает константу строку.
Все таблицы с которыми идет работы имеют индексы которыми я пользуюсь.
Этот запрос начинает очень долго выполняться.
Если его чуть изменить
/***********************************************/
select name, MY_FUNC.GetAccount(name) from NameTable
where
name like 'something_const';
/***********************************************/
то он начинает выполняться практически мгновенно.
Т.е. тормоза в функции MY_FUNC.GetNameMask() котороя состоит из одного
RETURN 'something_const';.
Как заставить Oracle выполянть первую версию запроса с нормальной скоростью. Только не предлагайте выбирать условие с помощью SELECT т.к. в общем случае функция MY_FUNC.GetNameMask(); может достаточно хитрой.
СУБД Oracle 8i
Спасибо
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32162699
Oracle_Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Все таблицы с которыми идет работы имеют индексы которыми я пользуюсь. "
select name, MY_FUNC.GetAccount(name) from NameTable
where
name like MY_FUNC.GetNameMask();

в этом случае индексы не используються. Вообще использовать функции в условии where категорически не рекомендуеться.
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32162704
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А индекс функциональный если построить?
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32162712
Oracle_Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 chp

Ради интереса опишите пожалуйста задачу. Занимаюсь тем же , что и Вы и не всречался с необходимостью вычисления счета по наименование клиента, учитывая, что у одного клиента может быть много счетов.
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32162737
none
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Вообще использовать функции в условии where категорически не рекомендуеться."

ЛОЖ!!!

Либо докажите ссылками на документацию.
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32162739
Фотография Andrew Campball
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте сравнивать другим образом name like MY_FUNC.GetNameMask() , а MY_FUNC.GetNameMask(name) = 1
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32162763
Oracle_Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 None

"ЛОЖ!!!"

Попробую объяснить почему мною были написаны строки

"Вообще использовать функции в условии where категорически не рекомендуеться."

При использовании функции в условии where сервер вынужден идти на полное сканирование таблицы.

Замечание:

Если таблица не большая ( справочник например) то конечно проблем не будет. тут и полное сканирование допустимо
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32162769
DimaR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Oracle_Developer
А что, сервер не может сначала проверить остальные условия в where а потом к полученой выборке применить ограничения с функцией?
(Я не имею ввиду пример приведенный в вопросе топика).
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32162777
Фотография RedPank
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно ... у меня оба варианта запроса выполняются одинаково. Планы идентичны.
А ты планы смотрел ???
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32162780
Oracle_Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное не совсем корректно сделал предыдущие высказывания. Вношу поправки.

Не желательно использование функций от колонки. т.е name = funct(колонка)

ссылку не помню. можно искать в тюненге
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32162850
chp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Oracle Developer:
Всю задачу я приводить не стану т.к. займет слишком много места. Функцию я использую в SELECT т.к. мне надо вывести данные отчета в Report, а он, как я понимаю, не позволяет в качестве источника данных использовать ничего кроме запроса. Пример приведен достаточно абстрактный, поэтому не заостряйте внимание на частностях. Суть вопроса - можно ли как-то ускорить выполнение запроса в условии которого, стоит вызов функции. Вообще раньше этот запрос был частью процедуы которая кидала в текстовый файл отчет по некоторым операциям при этом вызов MY_FUNC.GetAccount(name) применялся в цикле к записям курсора. Мне захотелоь переделать его в Report. Отладка проводилась на маленкой таблице ок. 10000 записей, а сейчас приходится работать с таблицей ок. 5000000 записей. В принципе я нашел выход, буду использовать процедуру (слегка переделанную кот. выводила данные в файл) в качестве источника данных - а из формы уже генерить отчет.
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32162862
chp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 RedPank
План = 89 в SQL Navigator - т.е. всё зашибись, видимо он умеет оптимизировать
так как как не умеет Oracle? Хотя выполнение идет ничуть не быстрее чем в Repotr.
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32162869
chp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу того что нежелательно использовать функции от столбца -
MY_FUNC.GetNameMask() и не использует, и вся функция бесхитростно возвращает константу.
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32162941
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй так
select name, MY_FUNC.GetAccount(name) from NameTable t1,
(select MY_FUNC.GetNameMask() mf from dual group by MY_FUNC.GetNameMask()) t2
where t1.name like t2.mf;
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32163001
chp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 nick
Этот способ тоже перебором работает, но уже по меньшей таблице.
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32163008
Oracle_Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А индексы используються точно? Скинь сюда план выполнения. Может из-за использования like индексы не используються
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32163078
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
like использует индексы если строка-шаблон не начинается с _ и/или %.
...
Рейтинг: 0 / 0
Использование самописных фунциях в запросах и скорость
    #32163105
chp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня новый вопрос, но вытекающий из старого
есть запрос:
select AAA.CHP.GetCusname(cXXXaccd) klient,
AAA.CHP.GetCacccur(cXXXaccd) val, mXXXsum,
flag -- здесь тормозит
from
(select dXXXcreate, cXXXaccd, iXXXdocnum, mXXXsum,
AAA.SPEC_CONTROL.CheckWhenAbcentDb40Cred474(dXXXcreate, cXXXaccd,iXXXdocnum, mXXXsum) flag from XXX
where (dXXXcreate>='12.03.03' and dXXXcreate<='13.03.03') and
iXXXtype > 0 and cXXXcur <> 'RUR' and
cXXXaccc like '47405%' and
cXXXaccd like '40___________1______')
where flag = 1 -- и здесь тормозит
Этот запрос выполняется неприлично долго - хотя если закомментировать
строки like '%тормозит%' то запрос выполянется за 3 сек., при этом возвращает всего 1 запись. Т.е. даже если во внешенм select идёт полный перебор всех записей внутренннего select, то перебор идет в таблице из одной строки. Он тормозит даже если закомментировать только последнюю строку. Почему так?
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование самописных фунциях в запросах и скорость
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]