2

データベースに 2 つのテーブルがあります。各テーブルには 2000 レコードがあります。多数のレコードがあるので、レコードを取得するための最適なコードを書きたいと思います。USER_DETAILSテーブルは次のとおりです。

+---------+-----------+-----------+
| user_id | user_name | join_date |
+---------+-----------+-----------+

テーブルを参照している2番目のテーブルは次のUSER_DETAILSとおりです。

+---------+-----------+-----------+
| user_id | fav_color | fav_dish  |
+---------+-----------+-----------+

最初のアプローチは2つあります。

SELECT UD.*,FAV.FAV_COLOR, FAV.FAV_DISH FROM USER_DETAILS UD, FAV_DETAILS FAV 
    WHERE UD.USER_ID = FAV.USER_ID;

2 番目のアプローチは、次のような PL/SQL プロシージャを作成することです。

DECLARE
CURSOR C1(X NUMBER) IS SELECT * FROM USER_DETAILS WHERE USER_ID = X;
CURSOR C2 IS SELECT * FROM USER_FAV;
Y NUMBER := &USER_ID;
BEGIN
FOR C IN C1(Y)
    LOOP
    DBMS_OUTPUT.PUT_LINE('USER DETAILS');
    DBMS_OUTPUT.PUT_LINE('----------------');
    FOR D IN C2
        LOOP
        IF C.DEPTNO = D.DEPTNO THEN
            DBMS_OUTPUT.PUT_LINE(RPAD(C.USER_ID,10)||RPAD(C.USER_NAME,10)||RPAD(D.FAV_COLOR,10));
        END IF;
    END LOOP;
END LOOP;
END;

パフォーマンスが向上するのはどのコードで、その理由は? ユーザーの完全な詳細を取得したい。

カーソルを使用している場合、サーバーから SGA へのすべてのレコードを取得できますか? このデータベースは、モバイル デバイスのみがアクセスする JSP ページで使用します。

モバイル デバイスのインターネットはターゲット ユーザーに対して非常に遅いため (約 10KB)、帯域幅が心配です。私の見解では、結合を実行するとデカルト積が実行され、PL/SQL ブロックのチェック条件が 1000 + 1000 のみであるため、1000*1000 条件から 1 つの条件を取得する一致結果がチェックされることがわかります。条件の数。しかし、私の知識によると、カーソルはクライアントメモリにシャドウページを作成し、テーブルを作成します。これは、サーバーからすべてのデータを取得し、クライアントに保存することを意味します。この時点で私は正しいですか?

4

3 に答える 3

2

ここでTom Kyte のマントラを読むことができます。

可能であれば、単一の SQL ステートメントで実行する必要があります。
単一の SQL 文で実行できない場合は、PL/SQL で実行してください。
PL/SQL で実行できない場合は、Java ストアド プロシージャを試してください。
Java で実行できない場合は、C 外部プロシージャーで実行してください。
C の外部ルーチンでそれを行うことができない場合は、なぜそれを行う必要があるのか​​を真剣に検討する必要があるかもしれません…</p>

基本的に、plsql ストアド プロシージャを使用して、SQL エンジンから plsql エンジンに前後に移動します。さらに、適切なインデックスがあり、クエリを正しく作成すれば、SQL オプティマイザーはおそらくあなたよりも高速になります。

ここに別の良いAskTo投稿があります

于 2013-02-19T06:12:23.663 に答える
1

通常、単一の選択ステートメントを使用すると、単一の選択によってパフォーマンスが向上
し、RDBMS Sql エンジンを 1 回ヒットし、RDMS は内部プロシージャ (インデックス、キャッシュされたクエリなど) を使用してパフォーマンスを向上させます。

プログラミング方法 (内部 RDMS 機能を無視)
では、最初のクエリで効率 O(n) の順序で検索を行っています。2 番目の plsql ステートメントでは、ネストされたループを使用して、効率 O(n^2) の順序で検索を行っています。
効率の検索順序

于 2013-02-19T08:25:48.570 に答える
0

さらにアクションを実行するために結果の各行にポインターが必要な場合は、cursor を使用します。selectステートメントだけが必要な場合は、ステートメントを実行してくださいselect。カーソルはやり過ぎです。複雑にしないでおく。

于 2013-02-19T05:47:53.060 に答える