Надяваме се, че някой може да хвърли малко светлина върху проблем, който в момента имам с Oracle DB - сигурен съм, че е нещо просто!!
Успях да пресъздам това в проба, така че ето структурата на DB:
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-6s.
Струва ми се, че това има нещо общо с привилегии и т.н., но не съм съвсем сигурен защо все още всъщност работи и в двете посоки??
Просто да хвърля нещо друго в тенджерата, ако променя процедурата на
SELECT ixMyTable, TO_CLOB(TO_NCLOB(clobData))
FROM MyTable;
Тогава времето е ~5-6s, със или без допълнителната привилегия SELECT.
Всякакви насоки или директни решения ще бъдат много оценени!
Редактиране:
Операционната система е Vista x86 Business
Oracle Server е 10.2.0.1
Oracle Client е 10.2.0.3
Редактиране:
Както беше предложено, опитах се да променя от MS OracleClient към ODP.NET и това ускорява според изискванията.
За съжаление приложението на C#, което беше засегнато, беше само вътрешно приложение, което се използва за преглед на таблици / изпълнение на SPROCS и т.н.
Нашият основен продукт е приложението C++, което използва OTL (http://otl.sourceforge.net/otl3_intro.htm) за достъп до база данни. Това всъщност не е нещо, което може да се промени в момента и затова наистина бих искал да разбера причините за разликата, без да се налага да хвърлям безвъзмездни GRANT SELECTs насам-натам.
Ако липсата на SELECT привилегия причини пълен провал, тогава вероятно бих могъл да се справя с това, но липсата на SELECT изглежда причинява по-бавен маршрут за достъп до CLOB данните.
Отбелязах 3-те отговора - благодаря за тях - но наистина мога да се справя с причина, така че ще добавя премия към това.
P.S. Наистина искахме да използваме OCCI в самото начало за нашия C++, но тъй като Oracle винаги поддържа версия на IDE преди текущата, не успяхме да я накараме да работи добре с нашето Visual Studio 2008.