希望有人可以對我目前與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