|
|
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
Вопрос к специалистам. У меня есть пакет в котором описано несколько функции, достаточно простых выполняю запрос примерно такого вида: /***********************************************/ 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 Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 09:55 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
"Все таблицы с которыми идет работы имеют индексы которыми я пользуюсь. " select name, MY_FUNC.GetAccount(name) from NameTable where name like MY_FUNC.GetNameMask(); в этом случае индексы не используються. Вообще использовать функции в условии where категорически не рекомендуеться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 10:24 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
А индекс функциональный если построить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 10:27 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
2 chp Ради интереса опишите пожалуйста задачу. Занимаюсь тем же , что и Вы и не всречался с необходимостью вычисления счета по наименование клиента, учитывая, что у одного клиента может быть много счетов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 10:30 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
"Вообще использовать функции в условии where категорически не рекомендуеться." ЛОЖ!!! Либо докажите ссылками на документацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 10:45 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
Попробуйте сравнивать другим образом name like MY_FUNC.GetNameMask() , а MY_FUNC.GetNameMask(name) = 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 10:47 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
2 None "ЛОЖ!!!" Попробую объяснить почему мною были написаны строки "Вообще использовать функции в условии where категорически не рекомендуеться." При использовании функции в условии where сервер вынужден идти на полное сканирование таблицы. Замечание: Если таблица не большая ( справочник например) то конечно проблем не будет. тут и полное сканирование допустимо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 11:02 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
to Oracle_Developer А что, сервер не может сначала проверить остальные условия в where а потом к полученой выборке применить ограничения с функцией? (Я не имею ввиду пример приведенный в вопросе топика). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 11:07 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
Странно ... у меня оба варианта запроса выполняются одинаково. Планы идентичны. А ты планы смотрел ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 11:18 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
Наверное не совсем корректно сделал предыдущие высказывания. Вношу поправки. Не желательно использование функций от колонки. т.е name = funct(колонка) ссылку не помню. можно искать в тюненге ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 11:25 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
2 Oracle Developer: Всю задачу я приводить не стану т.к. займет слишком много места. Функцию я использую в SELECT т.к. мне надо вывести данные отчета в Report, а он, как я понимаю, не позволяет в качестве источника данных использовать ничего кроме запроса. Пример приведен достаточно абстрактный, поэтому не заостряйте внимание на частностях. Суть вопроса - можно ли как-то ускорить выполнение запроса в условии которого, стоит вызов функции. Вообще раньше этот запрос был частью процедуы которая кидала в текстовый файл отчет по некоторым операциям при этом вызов MY_FUNC.GetAccount(name) применялся в цикле к записям курсора. Мне захотелоь переделать его в Report. Отладка проводилась на маленкой таблице ок. 10000 записей, а сейчас приходится работать с таблицей ок. 5000000 записей. В принципе я нашел выход, буду использовать процедуру (слегка переделанную кот. выводила данные в файл) в качестве источника данных - а из формы уже генерить отчет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 12:14 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
2 RedPank План = 89 в SQL Navigator - т.е. всё зашибись, видимо он умеет оптимизировать так как как не умеет Oracle? Хотя выполнение идет ничуть не быстрее чем в Repotr. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 12:23 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
По поводу того что нежелательно использовать функции от столбца - MY_FUNC.GetNameMask() и не использует, и вся функция бесхитростно возвращает константу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 12:27 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
Попробуй так 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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 13:20 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
2 nick Этот способ тоже перебором работает, но уже по меньшей таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 13:56 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
А индексы используються точно? Скинь сюда план выполнения. Может из-за использования like индексы не используються ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 14:02 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
like использует индексы если строка-шаблон не начинается с _ и/или %. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 14:45 |
|
||
|
Использование самописных фунциях в запросах и скорость
|
|||
|---|---|---|---|
|
#18+
У меня новый вопрос, но вытекающий из старого есть запрос: 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, то перебор идет в таблице из одной строки. Он тормозит даже если закомментировать только последнюю строку. Почему так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 15:01 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32162862&tid=1990488]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
153ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 415ms |

| 0 / 0 |
