うまくいけば、誰かが私が現在Oracle DBで抱えている問題に少し光を当てることができます-それは簡単なことだと確信しています!!
サンプルでこれを再現できたので、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 ロールがあります
上記のようにデータベースをセットアップすると、標準の System.Data.OracleClient.OracleCommand などを使用して PKGTEST.DoSomething を実行し、結果をデータグリッド (DevExpress) にスローする C# テスト アプリがあります。
オープン ソース OTL (幸いなことに、私の部門ではありません) を使用して c++ を介して同じ問題が発生するため、グリッドはここでは無関係であることを確認してください。
さて、問題に....
最初からグリッドにデータが入力されるまでの時間は 35 ~ 40 秒です。
ただし、次のようにすると:
GRANT SELECT ON MyTable TO TEST_ROLE
/
クエリを再度実行すると、5 ~ 6 秒かかります。
これは特権などと関係があるように思えますが、なぜ実際に両方の方法で機能するのかよくわかりません??
手順を次のように変更すると、ポットに何か他のものを投入するだけです
SELECT ixMyTable, TO_CLOB(TO_NCLOB(clobData))
FROM MyTable;
その後、追加の SELECT 権限の有無にかかわらず、時間は 5 ~ 6 秒です。
任意のポインタまたは直接的なソリューションをいただければ幸いです!
編集:
OSは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 SELECT を意に介さずに、違いの理由を理解したいと思います。
SELECT 権限がないために完全な障害が発生した場合は、おそらくこれを受け入れることができますが、SELECT 権限がないために、CLOB データにアクセスするためのルートが遅くなるようです。
私は3つの答えをマークアップしました-それらに感謝します-しかし、私は本当に理由でできるので、これに賞金を追加します.
PS C++ の最初から OCCI を使いたかったのですが、Oracle は常に最新バージョンより前のバージョンの IDE をサポートしているため、Visual Studio 2008 でうまく動作させることができませんでした。