2014-09-04 5 views
0

Итак, я читаю руководство для новичков Иана Абрамсона для Oracle Database 10g (исходя из использования mysql), и он упоминает PL/SQL и дает все эти большие причины для его использования, однако я делаю это в подготовка к переработке нескольких приложений, используемых моей компанией.Являются ли операции таблицы в PLSQL более эффективными, чем запуск их во внешнем приложении? (Oracle 10g)

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

Проблема в том, что мы на самом деле не знаем (и эта книга не говорит нам), насколько эффективный доступ к базе данных в PL/SQL над приложением, запущенным на другой машине, которая делает 3-5 (довольно большой) запросов на операцию. Я думаю, что с большей вероятностью будет работать быстрее, потому что (по моему знанию) функции pl/sql сохраняют и сохраняют свои планы выполнения, а традиционные сетевые накладные расходы будут сокращены в 3-5 раз (в зависимости от количества запросов)

ответ

3

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

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

Подводя итог, если это фактический код, связанный с базой данных (insert/update/delete/select), даже если он имеет вокруг себя некоторую нетривиальную логику, имеет смысл поместить его в базу данных. Если он не взаимодействует с базой данных, он, вероятно, не входит в базу данных.

И, наконец, ваши комментарии о эффективности кода PL/SQL верны. Эффективность w/PL/SQL достигается при анализе и хранении планов выполнения. Кроме того, PL/SQL автоматически будет предварительно получать данные.

много больше информации о преимуществах PL/SQL можно найти здесь: http://docs.oracle.com/database/121/LNPLS/overview.htm#LNPLS00101

Надежда, что помогает.

+0

Я знаю, что я, вероятно, прошу высказать больше мнения здесь, но если бы я работал с таким запросом, как «Get A, если A.property, получите B, если B.Property, получите C ..» (Фактически это рекурсивные операции в одной таблице, большинство уровней рекурсии, которые я видел, это 5, но это не значит, что она не может быть бесконечной), было бы лучше работать в pl/sql как можно больше из-за уменьшенных планов выполнения времени/кэширования в оба конца, или если избыточные проверки будут лучше размещены в приложении на стороне клиента? – Sidney

+0

Не уверен, что вы получаете, поскольку «получить a, если a.property, получить b, если b.property ...» на самом деле не является SQL-запросом. Кроме того, не уверен, что вы подразумеваете под «чрезмерными проверками» ...? –

+0

Ах, извините, я пытался сварить избыточный процесс. У нас есть таблица с рекурсивными индексами. Например, логическая структура в клиентской стороне - это что-то вроде «While (A.next is not 0) извлечь B из базы данных, установить A равным B». Существуют повторные проверки, чтобы увидеть, что A.next равно 0, и повторные запросы, чтобы получить B из базы данных. Мне интересно, не будет ли такая логика лучше реализована в PL/SQL. – Sidney