データベースに 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 つの条件を取得する一致結果がチェックされることがわかります。条件の数。しかし、私の知識によると、カーソルはクライアントメモリにシャドウページを作成し、テーブルを作成します。これは、サーバーからすべてのデータを取得し、クライアントに保存することを意味します。この時点で私は正しいですか?