簡體   English   中英

SQL%rowcount 導致 PL/SQL 性能下降

[英]PL/SQL performace hit with SQL%rowcount

我有一個 PL/SQL 腳本,我正在其中更新一些記錄,並根據此查詢的結果更新另一個表。

在一個循環中,我正在執行以下查詢,該查詢最多可以循環 100 000 條記錄。

update employee set dept='department' where empid=a.id;

IF SQL%rowcount = 1 THEN
    -- updating other table
END IF;

是否有任何替代邏輯來實現這一目標?

最有可能另一種選擇。

根據您的描述,您是在循環中執行此操作,這表明它一次只影響一行(基於where子句和sql%rowcount = 1 ;如果有很多行,您將檢查>= 1 ) . 這種方法通常意味着逐行緩慢。

看你是否能做到這一點上,而不是單一的行 完全取下環。

例如,如果這是您現在所擁有的:

begin
  for cur_r in (select deptno, empno 
                from emp 
                where job = 'CLERK'
               ) 
  loop
    update emp set sal = sal + 100
      where empno = cur_r.empno;

    if sql%rowcount = 1 then
       update dept set
         dname = dname || 'x'
         where deptno = cur_r.deptno
    end if;
  end loop;
end;

將其改寫為

begin
  update emp e set
    e.sal = e.sal + 100
    where e.job = 'CLERK';           --> condition from the cursor FOR loop

  update dept d set
    d.dname = d.dname || 'x'
    where d.deptno in (select e.deptno           --> SELECT used in
                       from emp e                --> cursor FOR
                       where e.job = 'CLERK'     --> loop
                      );
end;

使用 SQL 集合和UPDATE語句的RETURNING ... [BULK COLLECT] INTO子句

CREATE TYPE int_array IS TABLE OF NUMBER(10,0);

然后,如果您使用的是:

BEGIN
  FOR a IN (
    SELECT id
    FROM   first_table
    WHERE  some_condition = 'MET'
  ) 
  LOOP
    update employee set dept='department' where empid=a.id;

    IF sql%rowcount = 1 THEN
       UPDATE other_table
       SET    something = 'X'
       WHERE  employee_id = a.id;
    END IF;
  END LOOP;
END;
/

將其更改為:

DECLARE
  p_ids int_array;
BEGIN
  update employee
  set    dept = 'department'
  where  empid IN (
    SELECT id
    FROM   first_table
    WHERE  some_condition = 'MET'
  )
  RETURNING empid BULK COLLECT INTO int_array;

  UPDATE other_table
  SET    something = 'X'
  WHERE  employee_id MEMBER OF int_array;
END;
/

您將完全擺脫循環並直接使用已更新的主鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM