Надеюсь, кто-то может пролить немного света на проблему, которая у меня сейчас есть с БД Oracle - я уверен, что это что-то простое !!
Мне удалось воссоздать это в примере, поэтому вот структура БД:
CREATE TABLE MyTable(
ixMyTable NUMBER,
clobData CLOB
)
/
CREATE OR REPLACE PACKAGE PKGTEST
AS
PROCEDURE DoSomething(
cur_OUT OUT SYS_REFCURSOR
);
END PKGTEST;
/
CREATE OR REPLACE PACKAGE BODY PKGTEST
AS
PROCEDURE DoSomething(
cur_OUT OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN cur_OUT FOR
SELECT ixMyTable, clobData
FROM MyTable;
END;
END PKGTEST;
/
GRANT EXECUTE ON PKGTEST TO TEST_ROLE
/
BEGIN
FOR i IN 1 .. 7000 LOOP
insert into mytable values (i, TO_CLOB('123456'));
END LOOP;
END;
/
Дополнительная информация:
Владелец схемы - TEST_SCHEMA
Пользователь CARL
CARL имеет роль TEST_ROLE
Учитывая настройку базы данных, как указано выше, у меня есть приложение для тестирования C #, которое использует стандартный System.Data.OracleClient.OracleCommand и т. Д. Для выполнения PKGTEST.DoSomething и передачи результатов в сетку данных (DevExpress).
Уверен, что сетка здесь неуместна, так как мы сталкиваемся с той же проблемой через c ++, используя OTL с открытым исходным кодом (к счастью, не мой отдел).
ОК, к проблеме ....
Время от начала до заполнения сетки ~ 35-40 с, ой.
Однако, если я сделаю следующее:
GRANT SELECT ON MyTable TO TEST_ROLE
/
, а затем снова выполнить запрос, это займет ~ 5-6 с.
Мне кажется, что это как-то связано с привилегиями и т. Д., Но я не совсем уверен, почему это все-таки работает в обоих направлениях ??
Просто бросить что-то еще в банк, если я изменю процедуру на
SELECT ixMyTable, TO_CLOB(TO_NCLOB(clobData))
FROM MyTable;
Тогда время ~ 5-6 с, с или без дополнительной привилегии SELECT.
Будем весьма благодарны за любые указатели или прямые решения!
Edit:
ОС - это Vista x86 Business
Сервер Oracle: 10.2.0.1
Клиент Oracle - 10.2.0.3
Edit:
Как и предполагалось, я попытался перейти с MS OracleClient на ODP.NET, и это ускоряется по мере необходимости.
К сожалению, уязвимое приложение C # было только внутренним приложением, которое используется для просмотра таблиц / запуска SPROCS и т. Д.
Нашим основным результатом является приложение C ++, которое использует OTL (http://otl.sourceforge.net/otl3_intro.htm) для доступа к базе данных. Это на самом деле не то, что можно изменить в настоящее время, и поэтому я действительно хотел бы понять причины такой разницы , без необходимости бросать безвозмездные гранты вокруг волей-неволей.
Если отсутствие привилегии SELECT вызвало полный сбой, то, вероятно, я мог бы с этим смириться, но отсутствие SELECT, по-видимому, вызывает более медленный маршрут для доступа к данным CLOB.
Я пометил 3 ответа - спасибо за них - но я действительно мог бы объяснить причину, поэтому я добавлю награду к этому.
P.S. Мы действительно хотели с самого начала использовать OCCI для нашего C ++, но поскольку Oracle всегда поддерживал версию IDE до текущей версии, мы не могли заставить ее хорошо работать с нашей Visual Studio 2008.