希望有人可以对我目前与Oracle数据库有关的问题发表一些看法 - 我确定这很简单!阅读CLOB列很慢
我已经成功的样本中重建这一点,所以这里是数据库结构:
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(不是我的部门,幸运的是)经历了同样的问题。
OK,这个问题....从开始
时间,直到填充网格〜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系统业务
Oracle服务器是10.2.0.1
Oracle客户端是10.2.0.3
编辑:
至于建议,我我已经尝试从MS OracleClient更改为ODP.NET,并且按要求加速。
不幸的是,这是受到影响的C#应用程序只是其用于查看表/运行存储过程等
我们的主要递送是使用OTL(http://otl.sourceforge.net/otl3_intro.htm),用于访问数据库的C++程序的内部应用程序。这不是真的可以在这个时候改变,所以我真的很想理解差异的原因,而不必无所顾忌地选择GRANT SELECT。
如果缺乏SELECT权限导致完全失败,那么我可能会忍受这一点,但是缺少SELECT似乎会导致访问CLOB数据的一些较慢的路由。
我已经标出了3个答案 - 感谢那些 - 但我真的可以做一个理由,所以我会添加一个赏金。
P.S.我们真的很想和OCCI一起参与我们的C++,但是由于Oracle在目前我们始终支持IDE的一个版本,所以我们无法让它与我们的Visual Studio 2008良好地配合。
+1;关于缓存的好建议。 – DCookie 2009-01-23 18:26:41
是的,我们在进行性能测试之前就遇到了缓存问题,但这是一个一致的速度问题。即使是第一次使用TO_CLOB(TO_NCLOB())技术的调用也很快,我不希望这会在第一次运行时碰到缓存。谢谢。 – Carl 2009-01-24 07:43:25