Глупо ли писать большую программу пакетной обработки целиком на PL/SQL?

StackOverflow https://stackoverflow.com/questions/78626

  •  09-06-2019
  •  | 
  •  

Вопрос

Я начинаю работу над программой, которую, пожалуй, наиболее естественно можно описать как пакет вычислений с таблицами базы данных, и она будет выполняться раз в месяц.Все входные данные находятся в таблицах базы данных Oracle, а все выходные данные — в таблицах базы данных Oracle.Программа должна оставаться поддерживаемой в течение многих лет.

Кажется простым реализовать это в виде серии хранимых процедур, каждая из которых выполняет разумное преобразование, например распределяя затраты между отделами в соответствии с некоторыми бизнес-правилами.Затем я могу написать модульные тесты, чтобы проверить, соответствуют ли выходные данные каждого преобразования моим ожиданиям.

Плохая ли идея сделать все это на PL/SQL?Вы бы предпочли выполнять тяжелые пакетные вычисления на типичном объектно-ориентированном языке программирования, таком как C#?Разве не более выразительно использовать язык программирования, ориентированный на базы данных, такой как PL/SQL?

Это было полезно?

Решение

Обычно я говорю: используйте PL/SQL как можно меньше - обычно его гораздо сложнее поддерживать - на одной из моих последних работ я действительно видел, насколько запутанной и сложной может быть работа с ним.

Однако, поскольку это пакетная обработка - и поскольку ввод и вывод являются БД - имеет смысл поместить логику в PL/SQL - чтобы свести к минимуму "подвижные части".Однако, если бы это была бизнес-логика или компоненты, используемые другими частями вашей системы, я бы сказал, не делайте этого.

Другие советы

Вы описываете следующие требования

а) Должен иметь возможность реализовать партийную обработку b) Результат должен быть подлежит обслуживанию

Мой ответ:

  1. PL/SQL был разработан для достижения именно того, что вы описываете.Также важно отметить, что PL/SQL обладает преимуществами, недоступными в других инструментах.Язык хранимых процедур помещает обработку рядом с данными — именно там и должна находиться пакетная обработка.
  2. Достаточно легко написать плохо поддерживаемый код на любом языке.

С учетом вышеизложенного, ваша реализация будет зависеть от имеющихся навыков, правильного проектирования и соблюдения качественных процессов.

Чтобы быть эффективной, ваша реализация должна обрабатывать данные пакетно (выбирать пакетно и вставлять/обновлять пакетно).Опасность объектно-ориентированного подхода заключается в том, что его легко склонить к разработке, обрабатывающей данные построчно.Этот тип подхода содержит ненужные накладные расходы и будет значительно менее эффективным, чем дизайн, который обрабатывает данные пакетами строк.

Оба подхода можно успешно использовать.

Мэтью Батлер

Кое-что для других комментаторов: вопрос касается PL/SQL, а не SQL.Некоторые ответы, очевидно, касались SQL, а не PL/SQL.PL/SQL — это полнофункциональный язык баз данных, и он также является зрелым.Есть некоторые недостатки, но для того, что хочет сделать постер, это очень хорошо.

Нет, это не обязательно плохая идея.Если решение кажется вам простым и позволяет протестировать и проверить каждый процесс, похоже, это хорошая идея.ОО-платформы могут (хотя и не обязательно) быть плохими для больших наборов данных, поскольку создание объектов и накладные расходы могут снизить производительность.

Oracle разработала PL/SQL с учетом таких проблем, как ваша. Если есть достаточные корпоративные знания о базе данных и PL/SQL, это кажется разумным решением.Помните о больших пакетных наборах, поскольку каждый вызов PL/SQL к реальному механизму SQL представляет собой переключение контекста, поэтому процессы отдельных записей должны быть объединены в пакеты, где это возможно, для повышения производительности.

Просто убедитесь, что вы каким-то образом регистрируете то, что происходит, пока он работает.В противном случае у вас получится черный ящик, и если он где-то застрянет на несколько часов, вы будете задаваться вопросом, остановить его или дать ему поработать «еще немного».

PL/SQL — это развитый язык, который хорошо интегрируется с SQL.С каждой версией Oracle он становится все более мощным.Также, начиная с Oracle 11, PL/SQL по умолчанию компилируется в машинный код.

Я написал огромное количество программ пакетной обработки и создания отчетов как на PL/SQL, так и на Pro.C для одного проекта.Обычно они предпочитали, чтобы я писал на PL/SQL, поскольку их собственные разработчики, которые будут поддерживать их в будущем, обнаружили, что это легче понять, чем Pro.Код С.

В конечном итоге это была всего лишь действительно причудливая обработка или отчеты, написанные на Pro*C.

Нет необходимости писать их как хранимые процедуры, как упоминали другие люди, это могут быть просто файлы сценариев, которые запускаются по мере необходимости, что-то вроде сценария оболочки.Также значительно упростите контроль версий исходного кода и миграцию между тестовыми и производственными системами.

Пока вычисления, которые вам необходимо выполнить, могут быть адекватно и читаемо записаны в PL/SQL, тогда использование только PL/SQL будет иметь наибольший смысл.

Настоящая загвоздка заключается в удобстве сопровождения: очень легко написать неподдерживаемый SQL, хотя бы потому, что каждая СУБД имеет свой синтаксис и другой набор функций, когда вы выходите за рамки простого SQL DML, и нет реальных стандартов форматирования.комментирование и т. д.

Я создал пакетные программы, используя C# и SQL.

Плюсы С#:

У вас есть полная библиотека .NET и все возможности объектно-ориентированного языка.

Минусы С#:

*Пакетная программа и база данных разделены — это означает, что вам придется управлять пакетной программой отдельно от базы данных.

* Вам нужно избежать всего этого чертового кода sql.

Плюсы SQL:

* Прекрасно интегрируется с СУБД.Если это задание только манипулирует базой данных, имело бы смысл включить его в базу данных.В итоге вы получаете одну базу данных и все ее компоненты в одном пакете.

* Нет необходимости экранировать код sql.

*сохраняйте реальность — вы программируете в своей проблемной области

Минусы SQL:

Это SQL, и лично я его знаю не так хорошо, как SQL.

В общем, я бы придерживался использования SQL из-за плюсов, изложенных выше.

Это загруженный вопрос :) Есть пара дизайнов архитектуры программирования базы данных, о которых вы должны знать, и каковы их затраты/выгоды.Уровень 2 обычно означает, что у вас есть клиент, подключающийся к БД и выполняющий прямые вызовы SQL.Уровень 3 обычно означает, что у вас есть «сервер приложений», который выполняет прямые SQL-вызовы к БД, но клиент обращается к серверу приложений.Как правило, это обеспечивает «масштабирование».Наконец, у вас есть 2,5-уровневые приложения, которые используют двухуровневый формат, только работа разделена внутри хранимых процедур.

Ваш процесс похож на «бэк-офис», а клиентам/процессам просто нужны результаты, которые агрегируются и кэшируются раз в месяц.То есть нет агента, который подключается, причем подключается часто, и говорит «сделай эти расчеты».Вместо этого вы намекаете на процесс, который происходит время от времени, и вам может сойти с рук нереальное время.

Поэтому, учитывая эти требования, я бы сказал, что, как правило, будет быстрее быть ближе к данным и позволить SQL-серверу выполнять все вычисления.Я думаю, вы обнаружите, что близость к данным сослужит вам хорошую службу.

Однако при выполнении этих вычислений вы можете обнаружить, что некоторые вычисления недоступны для SQL-серверов.Возьмем, к примеру, расчет начисленных процентов по облигации или любому инструменту с фиксированным доходом.Не очень красиво в SQL и гораздо больше подходит для более богатых языков программирования.Однако, если у вас есть только простые средние значения и другие относительно разумные агрегаты, я бы придерживался хранимых процедур на стороне SQL.

Итак, опять же, недостаточно информации о характере ваших вычислений, или о том, что ваша компания требует от разработчиков в отношении возможностей SQL для поддержки, или о том, что говорит ваш босс... но поскольку я разбираюсь в SQL и хотел бы оставайтесь ближе к данным, я бы остановился на чистом SQL/хранимых процедурах для такой задачи.

ЮММВ :)

Обычно это не более выразительно, потому что большинство языков хранимых процедур отстойны по своей конструкции.Но, вероятно, оно будет работать быстрее, чем во внешнем приложении.

Я думаю, все сводится к тому, насколько вы знакомы с PL/SQL, сколько времени у вас есть на написание этого, насколько важна производительность и можете ли вы разумно ожидать, что сопровождающие будут достаточно знакомы с PL/SQL, чтобы поддерживать большую программу, написанную на языке PL/SQL. это.

Если скорость не важна и сопровождающие, вероятно, не владеют PL/SQL, возможно, вам лучше использовать «традиционный» язык.

Вы также можете использовать гибридный подход, при котором вы используете PL/SQL для генерации промежуточных данных (скажем, объединений таблиц, суммирования или чего-то еще) и отдельное приложение для управления потоком и проверки значений и ошибок.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top