Надеюсь, кто-то может пролить свет на проблему, которая у меня сейчас возникла с БД 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 имеет роль TEST_ROLE
Учитывая настройку базы данных, как указано выше, у меня есть тестовое приложение C#, которое использует стандартный System.Data.OracleClient.OracleCommand и т. д., чтобы выполнить PKGTEST.DoSomething и передать результаты в сетку данных (DevExpress).
Почти уверен, что сетка здесь не имеет значения, поскольку мы сталкиваемся с той же проблемой через С++, используя OTL с открытым исходным кодом (к счастью, не мой отдел).
Ладно, к проблеме....
Время от начала до заполнения сетки составляет ~ 35-40 секунд, ой.
Однако, если я сделаю следующее:
GRANT SELECT ON MyTable TO TEST_ROLE
/
а затем снова выполните запрос, это занимает ~ 5-6 секунд.
Мне кажется, что это как-то связано с привилегиями и т. д., но я не совсем уверен, почему это все еще работает в обе стороны??
Просто чтобы бросить что-то еще в котел, если я изменю процедуру на
SELECT ixMyTable, TO_CLOB(TO_NCLOB(clobData))
FROM MyTable;
Тогда время составляет ~ 5-6 с, с дополнительной привилегией SELECT или без нее.
Любые указатели или прямые решения будут высоко оценены!
Редактировать:
ОС - Vista x86 Business.
Сервер Oracle 10.2.0.1.
Клиент Oracle 10.2.0.3
Редактировать:
Как было предложено, я попытался перейти с MS OracleClient на ODP.NET, и это действительно ускоряется по мере необходимости.
К сожалению, затронутое приложение C# было просто внутренним приложением, которое использовалось для просмотра таблиц/запуска SPROCS и т. д.
Наш основной результат — приложение C++, использующее OTL (http://otl.sourceforge.net/otl3_intro.htm) для доступа к базе данных. На самом деле это не то, что можно изменить в настоящее время, и поэтому я действительно хотел бы понять причины разницы, не разбрасывая волей-неволей необоснованные GRANT SELECT.
Если отсутствие привилегии SELECT вызвало полный сбой, то я, вероятно, мог бы с этим смириться, но отсутствие SELECT, по-видимому, приводит к более медленному маршруту для доступа к данным CLOB.
Я пометил 3 ответа - спасибо за них - но мне действительно не помешала бы причина, поэтому я добавлю к этому награду.
P.S. Мы действительно хотели использовать OCCI с самого начала для нашего C++, но, поскольку Oracle всегда поддерживает более раннюю версию IDE, мы не смогли заставить ее хорошо работать с нашей Visual Studio 2008.