oracle - 在 Oracle 中使用游标对前端应用程序有好处吗?

标签 oracle plsql cursor

我的数据库中有两个表。每个表有 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 优化器可能会让事情比您更快。

Here is another good AskTom post

关于oracle - 在 Oracle 中使用游标对前端应用程序有好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14950646/

相关文章:

sql - 甲骨文 (11.2.0.1) : How to identify the row which is currently updated by the UPDATE statement

xml - 如何将 XML 数据存储到 Oracle 表中

c++ - 使用 Pro*C,如何在不设置 'sqlcheck=semantics' 选项的情况下从 PL 存储函数中打开的游标中获取数据?

sql - 如何只选择不在另一个表中的行而不获取另一个表的数据 - PLSQL

java - GAE 数据存储 - 如何始终获得最新/最新结果并从上次中断的地方继续?

c# - 连接oracle的odbc指令

sql - SELECT SQL语法,用于WHERE子句中的计数

oracle - 可以直接在表的 all_triggers 表中定义触发器吗?

java - Jasper 报告导致 SELECT 语句出现 CURSOR 问题

php - 在网站中使用等待光标好吗?