Предостережения об использовании конвейерных табличных функций в Oracle для реализации функциональности параметризованного представления?
Мы приняли решение наложить несколько "параметризованных представлений" на некоторые обычные представления в Oracle, чтобы должным образом поощрять использование правильных предикатов, которые всегда будут использоваться в запросах.
Большая часть повторяющегося кода (таблицы объединяются соответствующим образом) будет в представлении, так что у нас больше не будет много различных процедур и функций с их собственными копиями общих объединений и фильтров.
Затем мы наложим конвейерные табличные функции на эти представления, чтобы гарантировать, что вызывающие стороны предоставляют необходимые фильтры, чтобы представления не назывались "на все время и пространство". Я рассмотрел альтернативы, использующие переменные sys_context и userenv и пакета, и, хотя они, по-видимому, являются тем, что пользователи Oracle называют параметризованными представлениями, они просто не способны использовать эти прокладки вокруг представления каждый раз, когда они используются, и их нельзя повторно использовать в Самосоединения.
Я много читал об этом в самых разных местах, включая Stackru:
Табличные функции в ORACLE 11g? (параметризованные представления)
База данных: конвейерные функции
Разрешено ли использование SELECT внутри конвейерной табличной функции PL/SQL?
Это архитектурное решение, чтобы попытаться улучшить удобство сопровождения приложения, которое растягивается с большим количеством повторных запросов. Представления могут помочь, но я обеспокоен тем, что у нас нет способа принудительно использовать предикаты для вызывающих, чтобы они не делали глупостей.
Я имел большой успех, используя эту технику в SQL Server со встроенными табличными функциями, и это действительно помогло сделать систему намного более последовательной и упростить отслеживание зависимостей и последствий предлагаемых изменений, поскольку было меньше кода и б) больше повторного использования и меньше повторений.
Я немного волнуюсь по поводу этой последней ссылки, кажется, что это может означать, что у меня могут возникнуть проблемы с параллелизмом или синхронизацией, если я присоединюсь к одной из этих конвейерных табличных функций и использую ее для обновления другой таблицы.
Пожалуйста, поделитесь своим опытом с конвейерными табличными функциями и что мне нужно посмотреть? Кроме того, если есть лучшая альтернатива, дайте мне знать в своем ответе тоже?
1 ответ
Да, поведение запросов к таблице в конвейерной функции на определенный момент времени отличается от поведения запросов к таблице напрямую или через представление, поэтому это необходимо учитывать. Тем не менее, обычно это не проблема, если конвейерная функция запрашивает редко обновляемую таблицу. Я не могу думать ни о каких проблемах с параллелизмом или синхронизацией.
Моя основная проблема с предоставлением разработчикам конвейерных функций (в отличие от использования представлений) заключается в том, что ими (как и некоторыми представлениями) можно легко злоупотреблять. Разработчики могут выбрать объединение результатов одной конвейерной функции с другой, что приводит к очень неэффективным запросам, которые не могут использовать такие преимущества, как индексы, заданные предикаты и ограничения таблиц.
Если обслуживаемость является вашей основной проблемой, то я бы предпочел представления - они могут помочь уменьшить дублирующийся код, определяя общие преобразования в одном месте и, возможно, общие объединения; однако даже они слишком легко используются неправильно (например, присоединение к представлению, даже если оно присоединяется к другой таблице, которая не требуется исходным запросом).
Производительность и эффективность, вероятно, будут вещами, на которые нужно обратить внимание. Установите строгий режим проверки для всех SQL в приложении, чтобы искать плохо написанные или противоречивые запросы.