Как я могу использовать переменные связывания Oracle с SimpleDataSet Delphi? - PullRequest
2 голосов
/ 27 февраля 2012

У меня есть база данных Oracle 9, из которой мое приложение Delphi 2006 считывает данные в TSimpleDataSet, используя такой SQL-оператор, как этот (на самом деле он более сложный, конечно):

select * from myschema.mytable where ID in (1, 2, 4)

Мои приложения запускаются и выполняют этот запрос довольно часто в течение дня, каждый раз с различными значениями в предложении in.

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

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

Есть ли способ подготовить оператор, содержащий предложение in, один раз в базе данных, а затем выполнить его с другими параметрами, переданными из TSimpleDataSet, чтобы его не нужно было повторно анализировать каждый раз, когда мое приложение бежать?

1 Ответ

0 голосов
/ 29 февраля 2012

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

Сделав ваш запрос статичным, он может обойтись с помощью мягкого анализа или, возможно, вообще без анализа!Затем БД может кэшировать план выполнения, АБД могут работать с более «стабильным» SQL, и общая производительность должна быть улучшена.

...