【发布时间】:2009-01-23 17:54:28
【问题描述】:
希望有人能对我目前在使用 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 具有 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 商业版
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 个答案 - 谢谢那些 - 但我真的可以这样做,所以我会为此添加一个赏金。
附:我们真的很想在一开始就为我们的 C++ 选择 OCCI,但由于 Oracle 一直支持在当前版本之前的 IDE,我们无法让它与我们的 Visual Studio 2008 很好地配合。
【问题讨论】: