我在性能或程式上有問題。該程序具有游標宣告,然后是帶有更新陳述句的回圈體。當我運行該程式時,運行所有行更新需要幾個小時,但是當我將代碼放在蟾蜍的匿名塊中時,更新所有行需要 3 分鐘!!代碼之間沒有區別,只是一個在程式中,另一個是帶有declear和body的塊。程式是這樣的:
CREATE OR REPLACE procedure name_proc
is
v_start_lvl number;
v_level_nick varchar2(50);
v_rec_id number;
v_parent_type varchar2(3);
path_desc_num varchar2(1000);
delim_cut number;
error_var number;
cursor strt_lvl is
select REC_ID from WR_LEVELS_PATH
where start_level=-1;
BEGIN
for rec in strt_lvl loop
begin
begin
v_rec_id:=rec.rec_id;
select tr_parent
into v_start_lvl
from
(select tr_parent
from WR_LEVEL_PARENTS_REF
where rec.rec_id=REC_ID and PARENT_TYPE in ('STS','STM')
order by PARENT_TYPE)
where rownum=1;
if (v_start_lvl is not null)
then
begin
update WR_LEVELS_PATH
set start_level=v_start_lvl
where rec_id=rec.rec_id;
end;
end if;
end;
end loop;
commit;
end;
有沒有人對此有解釋??請!!!!
uj5u.com熱心網友回復:
如果在程序中運行代碼與從匿名 PL/SQL 塊運行代碼之間存在一致的差異,我認為您沒有在問題中包含真正的原因。只是在一個程序中不會讓你的代碼變慢,更不用說慢很多倍了。
要檢查的一些事項:
快慢跑是在同一個執行環境下嗎?即,您能否從 SQL*Developer 中手動進行兩次呼叫,從而產生差異?
兩個運行是否使用相同的資料庫用戶?
兩次運行都使用相同的輸入資料嗎?即,您可以在每次運行后回滾,在兩者之間切換,并始終保持一個快和一個慢嗎?
是否有其他用戶(或者您擁有的另一個會話)可能在
WR_LEVELS_PATH運行緩慢時鎖定了記錄?您知道如何檢查資料庫中的阻塞會話嗎?
所有這些差異更有可能是罪魁禍首,而不是在手術程序中產生的奇怪副作用。
此外,除非您省略了重要的事情來簡化您的問題,否則您的程序代碼似乎是不必要的。你可以用一條MERGE陳述句完成所有的邏輯:
MERGE INTO wr_levels_paths t
USING (
SELECT wlp.rec_id, wlpr.tr_parent
FROM wr_levels_paths wlp
CROSS APPLY ( SELECT wlpr.tr_parent
FROM wr_level_parents_ref wlpr
WHERE wlpr.rec_id = wlp.rec_id
AND wlpr.parent_type IN ('STS','STM')
ORDER BY wlpr.parent_type
FETCH FIRST 1 ROW ONLY ) wlpr
WHERE wlp.start_level = -1
AND wlpr.tr_parent IS NOT NULL ) u
ON ( t.rec_id = u.rec_id )
WHEN MATCHED THEN UPDATE SET t.start_level = u.tr_parent;
uj5u.com熱心網友回復:
1) 是的。fast 和slow 在同一個執行環境中。2)他們使用相同的資料庫用戶。3)它們具有相同的輸入資料,也給出相同的輸出資料。并更新相同數量的行。4) 我是桌上唯一的用戶。并且沒有塊會話。我是唯一連接到架構的用戶。謝謝您的回答...
rec_id 在列上有一個索引。也是獨一無二的。并且是一個數字...
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/393569.html
下一篇:通過sql獲取列中特定值的總和
