![]() |
|
Модераторы: LSD |
![]()
|
|
| Matrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 31.1.2006 Репутация: нет Всего: 2 |
Коллеги есть ли в PL/SQL какой либо механизм «кэширования результатов функции» - наверно так это можно назвать. Имеется ввиду, что если в функцию все время передаются одни и те-же параметры (по значению), то не стоит все время выполнять тело функции и рассчитывать результат, а выдавать сразу готовый ответ.
Оставим споры на счет того насколько это целесообразно, хочется получить конкретный ответ – «есть» или «нет»… |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
В PL/SQL - наврняка нет.
В SQL, я слышал, вроде пытались что-то сделать для детерминированных функций, начиная с 10й версии. Это сообщение отредактировал(а) Zloxa - 9.2.2011, 11:44 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Matrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 31.1.2006 Репутация: нет Всего: 2 |
Понял, спасибо за ответ...
Добавлено через 1 минуту и 6 секунд Кстати, а как этот механизм правильно называется, дабы почитать об этом поподробнее... |
|||
|
||||
| Zloxa |
|
||||||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
Добавлено @ 11:49 Добавлено @ 11:50 Может расскажете с какой проблеммой сотолкнулись, а не как пытаетесь решать? Добавлено через 4 минуты и 32 секунды блин, а ведь и вправду работает
Это сообщение отредактировал(а) Zloxa - 9.2.2011, 11:51 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
||||||
|
|||||||
| Matrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 31.1.2006 Репутация: нет Всего: 2 |
А чего-ж не рассказать? – свежие идеи всегда к месту
Это все продолжение моих идей на счет состава изделий и замен в составе изделий (мы когда-то говорили об этом). Я реализовал этот механизм с использованием поплайна – в некоторых случаях тормозит прилично, особенно когда ты хочешь построить одновременно состав нескольких изделий и когда выполняются «замены замен»… И это понятно – для каждого элемента выполняется функция на выборку из таблицы замен на предмет «есть ли замена»? Вот тут бы эта особенность функции и пригодилась… Сейчас рассматривается вопрос с использованием временных таблиц, ну, и попутно, другие варианты… |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
Нет, не пригодилось бы.
Это кэширование работает только для детерминированных функций - функций, зависящих только от входных параметров. Если функция зависит еще от состояния сессии, от даных в базе, от времени, она не детерменирована, и ее кеширование может исказить результат. И это, более чем разумно. Оракле ведь не ведомо, каково то событие, которое должно сбросить кэш. Потому, для данного случая, если есть необходимость кэшировать, придется делать это самостоятельно. И самостоятельно же сбрасывать кэш. Правда средствами pl/sql, пожалуй, кэшировать получится только в рамках сессии, не приложения. Это сообщение отредактировал(а) Zloxa - 10.2.2011, 09:58 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Matrex |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 31.1.2006 Репутация: нет Всего: 2 |
Предлагаю проверить следующим образом:
выполняется 0,5 сек
выполняется 1 сек Т.о. получается, что каждый раз при обращении к функции цикл выполняется заново… Или я не правильно понимаю понятие «детерминированных функций»? |
||||||
|
|||||||
| Zloxa |
|
||||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
да, так вызывается два раза
Но с этим случаем как раз все ясно и давно известно что делать
-------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
||||
|
|||||
| Matrex |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 31.1.2006 Репутация: нет Всего: 2 |
Согласен, я привел частный случай. А когда ситуация следующая
то как быть? Зачем функцию рассчитывать дважды? Сразу реальный пример. В системе существуют данные с уникальным идентификатором ID. Для каждого данного предусмотрено изменение статусов (Разработка=1, Производство=2, Архив=3 и т.д.). Статусы меняются во времени (т.е. некоторые данные в текущий момент могут иметь и статус "Производство" и "Архив" и "Разработка"). Задача – получить все данные на «Разработке» и текстовое описан статуса. Я делаю примерно таким образом:
Если учесть, что элементы «живут» не только в таблице detail, но и в других таблицах (в программе я просто меняю таблицу на другую), то «запрос в подзапросе», имхо, не есть гут, а вот функция, сохранившая свой результат (хотя бы для данного сиквела, или для считываемый в настоящий момент линии) для одного и того же a.id, была бы кстати… |
||||
|
|||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
так же - заворачиват в подзапрос, использовать вне его. этот вопрос не может быть не риторическим. очевидно же, что вы делаете это совсем не так, как следует делать чтобы это было эффективно. По приведенному Вами фрагменту, становится очевидно что вы пытаетесь использовать привычные вам парадигмы, заимствованные из других сфер программирования. До тех пор, пока вы не перестроите свое мышление, вам сложно будет производить сколь нибудь эффективный код. Да, объектно ориентированный, функциональный подходы хороши, повторное использование и все блабла но они плохо сочетются с теорией множеств, ибо предполагают работу прежде всего с одним объектом, а не множеством их. спасибо, поржал. но этого нет, этого никто не обещал, и это реалии. Более того, не сказал бы я что это действитлеьно нужно. И... вы знаете, я не могу припомнить никаких других языков, которые кэшировали бы вызовы функций. Это сообщение отредактировал(а) Zloxa - 9.2.2011, 18:22 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Matrex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 31.1.2006 Репутация: нет Всего: 2 |
Разумеется, рожденный программером свой опыт пытается и на другие сферы перенести – тем более, когда это кажется логичным, и в добавок курсы PL/SQL не посещал…
А на счет «запрос в подзапросе» - ничего не вижу смешного – когда имеется ввиду, данная конкретная задача и данный конкретный сиквел. Пока моих юзеров быстродействие не смущает – нет смысла переделывать. Кстати, вот тоже реальный пример, когда эту функцию (по определению статуса документа, из таблицы oma_stat) пришлось переделывать из-за быстродействия. Получилось нечто такое:
Результат, конечно супер – прирост производительности - на порядок, однако читаемость сиквела оставляет желать лучшего… Ладно, мы уже переходим в оффтоп, так что пора подвязывать… Благодарю за советы. Буду копать. |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
-------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
![]()
|
| Правила форума "Oracle" | |
|
|
Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Oracle | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |