[英]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.