Borland Builder C ++ Оракул вопрос - PullRequest
2 голосов
/ 20 мая 2011

У меня есть приложение Borland C ++ 6, вызывающее базу данных Oracle 10g.Работа через локальную сеть.Когда рассматриваемое приложение делает простой выбор БД, например,

select table_name from  element_tablenames where element_id = 10023842

, следующее записывается как происходящее в Oracle (из журналов производительности)

select table_name 
  from element_tablenames 
 where element_id = 10023842

, а затем немедленно (а не из C ++исходный код, но, возможно, глубже)

select table_name, element_tablenames.ROWID 
  from element_tablenames 
 where element_id = 10023842

Оператор select вызывается только один раз в объекте TADODbQuery, но выполняются два запроса - один для анализа, а другой добавляет ROWID дляexecuton.

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

Кто-нибудь знает, почему это может происходить, может кто-то предложить решение?

Ответы [ 2 ]

3 голосов
/ 20 мая 2011

Согласен с Робертом.

ROWID однозначно идентифицирует строку в таблице, чтобы возвращаемая запись могла быть применена обратно в базу данных с любыми изменениями (или как УДАЛЕНО).

Есть ли способ идентифицировать конкретный столбец (или набор столбцов) в качестве первичного ключа, чтобы его можно было использовать для идентификации строки без использования ROWID.

0 голосов
/ 20 мая 2011

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

Из документов Oracle :

Если таблица базы данных не содержит первичного ключа, ROWID должен быть выбран явно, когдазаполнение DataTable.

Так что я подозреваю, что у вашей таблицы нет первичного ключа, либо добавьте его, либо добавьте rowid.В любом случае это решит проблему с дублирующимся запросом.

Поскольку вы беспокоитесь о производительности.В целом

Используя TAdoQuery, вы можете установить CursorType для оптимизации различных режимов поведения для повышения производительности. Эта статья описывает это с точки зрения TAdoQuery. В MSDN также есть статья , в которой она рассматривается с общей точки зрения ADO.Наконец, могут быть полезны спецификации от драйвера Oracle .

Я бы порекомендовал установить курсор в любое из них, поскольку они поддерживаются только Oracle

  • ctStatic - Произведен двунаправленный запрос.
  • ctOpenForwardOnly - Произведен однонаправленный запрос, самый быстрый, но не может вызвать Prior

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

...