Oracle SQL和PL/SQL上下文切换

3

我有一段Oracle PL/SQL代码,想要真正了解其中有多少上下文切换。

If x=0 then 

  curserx= select a from mytable1;

Else

  curserx=select a from mytable1 where id=:x;

End;

Loop

  Fetch on cursorx

  Select c from mytable2 where a=curserx.a;

End loop;

这只是示例代码,请原谅任何文本大小写和逻辑错误。


你能详细说明一下上下文切换对你来说意味着什么吗? - mkuligowski
引用关于游标、上下文切换和错误的问题(这将回答OP的问题):但是,当涉及执行PL / SQL代码和执行SQL语句时,您正在查看两个不同的引擎。 PL / SQL运行时引擎执行PL / SQL块及其中的语句。 SQL引擎执行SQL语句。 - Mark Stewart
1个回答

4
我将您的伪代码转换为PL/SQL,并包含注释,指出我认为您将从PL/SQL引擎切换到SQL引擎的位置。
请注意,如果您查询的行数不少,则可以使用FETCH BULK COLLECT INTO,并在每次检索时检索多行,从而大大减少上下文切换。
DECLARE
   l_x_value   INTEGER;
   l_cursor    SYS_REFCURSOR;
   l_fetched   mytble1.a%TYPE;
BEGIN
   /* context switch to open */
   IF x = 0
   THEN
      OPEN l_cursor FOR SELECT a FROM mytable1;
   ELSE
      OPEN l_cursor FOR
         SELECT a
           FROM mytable1
          WHERE id = l_x_value;
   END IF;

   LOOP
      /* context switch per fetch */
      FETCH l_cursor INTO l_fetched;

      EXIT WHEN l_cursor%NOTFOUND;

      /* context switch for implicit cursor */
      SELECT c
        INTO l_fetched
        FROM mytable2
       WHERE a = curserx.a;
   END LOOP;

   /* context switch to close */
   CLOSE l_cursor;
END;

但这还不是全部!记住,上下文切换是双向的:SQL -> PL/SQL 和 PL/SQL -> SQL。通过使用UDF pragma(12c+)或使用WITH FUNCTION子句(也是12c+),您可以减少从SQL到PL/SQL的开销。仍然存在上下文切换,但一些工作在编译时完成,而不是运行时。因此,在下面的代码中,对于每次从SELECT中调用函数,都会发生上下文切换。
CREATE OR REPLACE FUNCTION full_name (first_in   IN VARCHAR2,
                                      last_in    IN VARCHAR2)
   RETURN VARCHAR2
IS
BEGIN
   RETURN first_in || ' ' || last_in;
END;
/

DECLARE
   l_name   VARCHAR2 (32767);
BEGIN
   SELECT full_name (first_name, last_name) INTO l_name 
     FROM employees
    WHERE employee_id = 100;

   DBMS_OUTPUT.PUT_LINE (l_name);
END;
/

最后要提醒的是:你应该尽一切可能避免在SQL函数内执行SQL,然后再从SQL调用该函数。适用于你的SQL语句的标准读取一致性模型将不会“传递”到函数的SQL中。换句话说,如果你的“外部”SELECT从10:00开始运行并持续一个小时,在10:05,有人删除了表中同时被外部查询和函数查询使用的行(并提交),那么这两个查询将使用这些表的不同状态。

小伙子,我很高兴我没有试图在我作为评论发布给OP的文章上进行详细阐述!解释得很好! - Mark Stewart
Steven,谢谢你的解释。请问当我们在PL/SQL代码中执行SQL时,是否会发生上下文切换? - Vinay Taneja
1
我在此确认,如果您从 SQL 中执行 PL/SQL,那么也会发生上下文切换。我将把它添加到上面的示例中。 - Steven Feuerstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接