希望有人能对我目前在使用 Oracle 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)。
很确定网格在这里无关紧要,因为我们通过使用开源 OTL 的 c++ 遇到了同样的问题(幸运的是,不是我的部门)。
好的,解决问题....
从开始到填充网格的时间约为 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 等的内部应用程序。
我们的主要交付物是使用 OTL ( http://otl.sourceforge.net/otl3_intro.htm ) 进行数据库访问的 C++ 应用程序。目前这不是真的可以改变的东西,所以我真的很想了解造成这种差异的原因,而不必无缘无故地抛出无缘无故的 GRANT SELECTs。
如果缺少 SELECT 权限导致完全失败,那么我可能会忍受这种情况,但缺少 SELECT 似乎会导致访问 CLOB 数据的路径变慢。
我已经标记了 3 个答案 - 谢谢那些 - 但我真的可以有一个理由,所以我会为此添加一个赏金。
PS 我们真的很想在一开始就为我们的 C++ 使用 OCCI,但是由于 Oracle 一直支持在当前版本之前的 IDE,我们无法让它与我们的 Visual Studio 2008 很好地配合使用。