[Oracle SQL] типа таблица от параметра
если хочется именно чтобы была функция, которая возвращает таблицу - есть "pipelined table function"
оптимизировать нужно будет здорово все это.
но главное, что считается там все не a + b, а считается с помощью PL/SQL, что с вьюхой никак не сделаешь.
долго считаться будетвозможно сейчас меня закидают помидорами, но есть materialized view.
ещё можно сделать таблицу заполняемую раз в N времени, или по триггерам.
а считается с помощью PL/SQL, что с вьюхой никак не сделаешь.в оракле в скулёвых запросах можно использовать хранимки. гугли по "конвейерные функции".
pipelined function
А вообще просто база онлайн. грузить материалайзд вью ее смертельно непредусмотрительно. да и если не грузить днем и посчитать ночью, то не будет при обращении днем "свежих данных". а данные действительно меняются шустро.
pipelined functionепт, чо-то интересное. буду читать. всем спс.
Тогда не парься и пиши въюху. Оно весьма шустро работает, если правильно оптимизировано.
я ж говорю, для подсчета величин нужен pl/sql код.
З.Ы. и да, не оптимизируй ничего "на глазок". только профилировщиком. или хотя бы план/стоимость запроса смотри на базе. только не на тестовой, а на рабочей.
врубиться в этот селект новому человеку будет сложно. тут как бы простоту и читаемость нужно учитывать.
сделай функции, а потом их "спрячь" во вью, а в конечном запросе используй уже вьюху
разбивай и декомпозируй.
вьюха нихера себе получается.
парировать пока нечем. единственный аргумент - кода очень много. править его в одномочень большом селекте очень сложно будет. хочется более-менее структурированный объект.для этого есть with
врубиться в этот селект новому человеку будет сложно. тут как бы простоту и читаемость нужно учитывать.
в идеале нужно всё загнать в sql, разбив на блоки with, в которых ты будешь фильтровать и обогащать информацию; они будут последовательны, их просто читать и документировать, не то что inline-views
дополнительный плюс with - можно материализовывать отдельные блоки через materialize, что зачастую положительно сказывается на производительности, минус тут будет в отсутствии индексации, так что делать это нужно аккуратно - только когда в блоке сравнительно мало (<1000) строк, и его получается выгоднее джойнить хэшем в любом случае
Не лучше ли создать хранилище данных, отделённое от оперативной базы, которое ты обвешаешь индексами и сможешь мгновенно вытягивать всю необходимую инфу запросом с минимальным костом?
зачем использовать with, если можно его вычленить в отдельную вьюху? ведь этот код может использоваться где-то ещё. потом запаришься во всех местах что-то менять, когда потребуется. имхо он немного не для того предназначен.
2. Чтоб сделать единый запрос читаемым, как книгу.
Что он для другого предназначен спорить не буду, но здесь он может пригодиться, если важен последующий рефакторинг.
Мелкие вьюхи на каждый блок имеют смысл, на мой взгляд, если их мало. Если их куча, то будет неудобно, да и повторное использование обычно бывает не масштабным и в рамках одной задачи. Логичнее уж тогда использовать мелкие матвьюхи с query rewrite, но и там код всё равно будет заново руками набираться, просто работать станет быстрее.
with не подойдет, потому что.... внимание!....есть приложение, в котором также планируется использование этого мега объекта. Приложение для одной из своих задач хавает только SQL и, барабанная дробь, with не хавает.
ты сам-то понял, что сказал?
ограничение на начало фразы с select или названия процедуры обычно в интерфейс вшиваются просто так, а так как план строится уже на стороне сервера, то внутрь вызываемого объекта можно пихать что угодно
да, не понял от чем сначала. это понятно.
Оставить комментарий
Teteshnik
Не знал как еще назвать пост. Ну да ладно.Вобщем.
Есть у нас таблица people.
Для каждого человека нужно высчитать кучи инф-ии по базе. Совершенно различной. Пол, вес, цвет волос, средний пол за период, наихудший цвет волос за период. Не суть что. Используется много PL/SQL кода.
Все эти данные приходится использовать в сотнях отчетов.
Мне нужен объект БД, который зависел бы от параметра, т.е. id человека. При вызове которого в языке SQL, я мог бы его присоединить как таблицу по ID и выбрать все нужные поля из этого объекта. А в объекте собственно поля и есть - то что мне нужно было посчитать по базе.
Либо как курсор
Сейчас реализовано как type + функция как оболочка этого типа.
в итоге немного туповато выглядит при вызове. т.е. в ф-ю нужно передать параметр, который я хочу достать из type. т.е.
person_params(ID,'worse_hair_colour')
Подскажите плиз чего-нить, ато еще весь SELECT manual не асилил