希望有人能够对我目前使用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).
很确定网格在这里是无关紧要的,因为我们使用开源OTL(不幸的是我的部门)通过c ++遇到了同样的问题.
好的,问题....
从开始到网格填充的时间是~35-40s,哎哟.
但是,如果我执行以下操作:
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客户端是10.2.0.3
编辑:
正如所建议的那样,我尝试从MS OracleClient更改为ODP.NET,这确实可以根据需要加快速度.
不幸的是,受影响的C#应用程序只是一个内部应用程序,用于查看表/运行SPROCS等.
我们的主要交付内容是使用OTL(http://otl.sourceforge.net/otl3_intro.htm)进行数据库访问的C++应用程序.这不是真正可以改变的东西,所以我真的想了解差异的原因,而不必在willy-nilly周围抛出无偿的GRANT SELECT.
如果缺少SELECT权限导致完全失败,那么我可能会接受这一点,但缺少SELECT似乎导致访问CLOB数据的路径较慢.
我已经标记了3个答案 - 感谢那些 - 但我确实有理由这样做,所以我会为此添加一笔赏金.
PS我们真的很想在OCCI开始时使用OCCI,但是由于Oracle始终支持IDE的一个版本,因此目前我们无法使用它来与我们的Visual Studio 2008完美配合.
你确定每次都从磁盘读取blob,而不是从磁盘缓存中读取第二个及后续的吗?
我已经在性能测试中看到了这个问题,特别是在Oracle上,第一次测试运行非常糟糕.然后,有一个小的(并且看似微不足道的变化),性能突然显着提高.但实际上发生的事情是,您查询的数据已加载到缓存中,并且可以以10倍或20倍的速率访问(内存与磁盘).
执行此测试的正确方法是在查询运行之间退回数据库.如果DBA不允许您为此测试退回测试生产服务器,请在您的计算机上加载Oracle XE的副本.
编辑:或更好:每次都删除并重新创建表.你可能会这样做,但没有提到它.