我的数据库中有两个表。每个表有 2000 条记录。由于我有大量记录,我想编写用于检索记录的最佳代码。USER_DETAILS
表是:
+---------+-----------+-----------+
| user_id | user_name | join_date |
+---------+-----------+-----------+
引用表的第二个表USER_DETAILS
是:
+---------+-----------+-----------+
| user_id | fav_color | fav_dish |
+---------+-----------+-----------+
我有两种方法第一种:
SELECT UD.*,FAV.FAV_COLOR, FAV.FAV_DISH FROM USER_DETAILS UD, FAV_DETAILS FAV
WHERE UD.USER_ID = FAV.USER_ID;
第二种方法是编写一个 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)在移动设备中的互联网速度非常慢,因此我担心带宽。在我看来,我发现执行连接将执行笛卡尔积并检查匹配结果,这将在 1000*1000 个条件中取一个条件,而 PL/SQL 块中的检查条件仅为 1000 + 1000。它减少了条件的数量。但据我所知,游标将在客户端内存中创建一个影子页面,并将创建表。这意味着它将从服务器获取所有数据并存储在客户端中。在这一点上我是正确的吗?