2

やや低速なネットワーク リンクを介して接続する Oracle データベースがあります。そこには、次のような単純なテーブルがあります。

create table EMPLOYEES (
    employee_id INTEGER PRIMARY KEY,
    first_name VARCHAR2(4000)
);

そして、そこからすべての行を取得するために、かなり退屈なクエリを使用しています。

select employee_id, first_name from EMPLOYEES

ここまでは順調ですね。ただし、Toad にそのクエリの結果のすべての行をエクスポートするように依頼すると、約 4 秒かかることに気付きました。私の .NET アプリケーションでは、130 秒かかります。かなりのハッキングの後、FIRST_NAME 列の最長値が 50 文字であることに気付きました。そのため、クエリを次のように変更しました。

select employee_id, substr(first_name, 1, 50) from EMPLOYEES

現在、Toad と私の C#/.NET プログラムの両方で非常に高速です。Microsoft と Oracle の両方のデータ プロバイダー ライブラリを使用してこれを試しましたが、結果は同じでした。

ここで何が起こっているのですか?私が思うに、Oracle は実際に行ごとに 4000 バイトを送信し、クライアントに任せて適切な長さに切り詰めているのでしょうか。「varchar」の「var」のポイントは何ですか?また、Toad はこの問題をどのように回避していますか? また、どうすれば同じことを行うことができますか?

4

1 に答える 1

1

いいえ、Oracle は 4,000 バイトを送信していません。Toad ですべてのレコードを実際にスプールしていると仮定しましょう。Toad が行っているのは、レコードを取得して画面上のグリッドに出力することだけですか? あなたのコードは何をしていますか?SQL は同時に実行されている可能性がありますが、コードは時間を追加する他の処理を行っています。

何が起こっているのかを本当に知るには、1 つまたは 2 つのことを行う必要があります。

まず、SQLNet クライアント トレースを実行します。それでも答えが得られない場合は、セッションのサーバー トレースを実行する必要があります。

于 2013-01-09T20:25:45.753 に答える