我的数据库中有两个表。每个表有 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 block 中的检查条件仅为 1000 + 1000。它减少了条件的数量。但据我所知,光标将在客户端内存中创建一个影子页面,并创建该表。这意味着它将从服务器获取所有数据并存储在客户端。我现在的说法正确吗?
最佳答案
您可以阅读here汤姆·凯特的口头禅:
You should do it in a single SQL statement if at all possible.
If you cannot do it in a single SQL Statement, then do it in PL/SQL.
If you cannot do it in PL/SQL, try a Java Stored Procedure.
If you cannot do it in Java, do it in a C external procedure.
If you cannot do it in a C external routine, you might want to seriously think about why it is you need to do it…
基本上,通过使用 plsql 存储过程,您可以在 sql 引擎之间来回移动。更重要的是,如果您有正确的索引并且正确构建了查询,sql 优化器可能会让事情比您更快。
关于oracle - 在 Oracle 中使用游标对前端应用程序有好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14950646/