loop迴圈 長時間沒有返回結果
從昨天下午就收到公司前臺郵件 說某個pl/sql程式執行長時間沒有返回資料 以前卻沒有過類似的效能問題 而且該問題只在一個測試環境中存在 其他環境包括生產環境都很正常 先大致整理出該程式
CREATE OR REPLACE PROCEDURE get_cost
(
item_id_in NUMBER,
part_id_in NUMBER,
ship_method_in NUMBER,
region_in NUMBER,
price_out OUT NUMBER,
is_override_out OUT VARCHAR2
) IS
v_weight NUMBER(12,4);
BEGIN
FOR c IN
(
SELECT mpo.ship_charge
FROM ff_override mpo
WHERE mpo.item_id = item_id_in
AND mpo.distributor_id = partner_id_in
AND mpo.shipping_method_no = ship_method_id_in
AND mpo.region_id = region_id_in
) LOOP
price_out := c.ship_charge;
is_override_out := 'Y';
RETURN;
END LOOP;
END;
當debug該程式時候 幾個小時不會返回結果 但是在其他環境用不到1秒 ff_override表上有一個unique組合索引 正好是上述的四個欄位
另外 當用匿名程式執行時 同樣很快
DECLARE
item_fixed_price_out NUMBER;
is_override_out VARCHAR2(2);
BEGIN
dbms_output.put_line('123');
FOR c IN (
SELECT mpo.ship_charge
FROM ff_override mpo
WHERE mpo.item_id = 13031529
AND mpo.distributor_id = 255075
AND mpo.shipping_method_no = 101
AND mpo.region_id = 1001) LOOP
dbms_output.put_line('456789');
item_fixed_price_out := c.ship_charge;
is_override_out := 'Y';
RETURN;
END LOOP;
END;
--只耗時0.0031秒
如果在儲存過程中 去掉四個列中的任意一個 也就是
CREATE OR REPLACE PROCEDURE get_cost
(
item_id_in NUMBER,
part_id_in NUMBER,
ship_method_in NUMBER,
region_in NUMBER,
price_out OUT NUMBER,
is_override_out OUT VARCHAR2
) IS
v_weight NUMBER(12,4);
BEGIN
FOR c IN
(
SELECT mpo.ship_charge
FROM ff_override mpo
WHERE mpo.item_id = item_id_in
AND mpo.distributor_id = partner_id_in
AND mpo.shipping_method_no = ship_method_id_in
--AND mpo.region_id = region_id_in
) LOOP
price_out := c.ship_charge;
is_override_out := 'Y';
RETURN;
END LOOP;
END;
呼叫時也會很快的返回結果
現在所能肯定的是
該表的索引完好 匿名過程呼叫時候返回超快 而且執行計劃用到了unique index
在儲存過程中 連線條件中任意三列組合 也能返回較快結果 但是四列組合卻超級慢
而且我們用的是客戶端 不能使用10046事件 動態效能檢視也少的可憐 只有v$session v$longops沒有v$session_wait
還請各位一道分析一下
PS: 諸如 飄過 頂 之類的垃圾回覆就不要了 大家都是出來混的 又這麼忙 彼此理解一下
CREATE OR REPLACE PROCEDURE get_cost
(
item_id_in NUMBER,
part_id_in NUMBER,
ship_method_in NUMBER,
region_in NUMBER,
price_out OUT NUMBER,
is_override_out OUT VARCHAR2
) IS
v_weight NUMBER(12,4);
BEGIN
FOR c IN
(
SELECT mpo.ship_charge
FROM ff_override mpo
WHERE mpo.item_id = item_id_in
AND mpo.distributor_id = partner_id_in
AND mpo.shipping_method_no = ship_method_id_in
AND mpo.region_id = region_id_in
) LOOP
price_out := c.ship_charge;
is_override_out := 'Y';
RETURN;
END LOOP;
END;
當debug該程式時候 幾個小時不會返回結果 但是在其他環境用不到1秒 ff_override表上有一個unique組合索引 正好是上述的四個欄位
另外 當用匿名程式執行時 同樣很快
DECLARE
item_fixed_price_out NUMBER;
is_override_out VARCHAR2(2);
BEGIN
dbms_output.put_line('123');
FOR c IN (
SELECT mpo.ship_charge
FROM ff_override mpo
WHERE mpo.item_id = 13031529
AND mpo.distributor_id = 255075
AND mpo.shipping_method_no = 101
AND mpo.region_id = 1001) LOOP
dbms_output.put_line('456789');
item_fixed_price_out := c.ship_charge;
is_override_out := 'Y';
RETURN;
END LOOP;
END;
--只耗時0.0031秒
如果在儲存過程中 去掉四個列中的任意一個 也就是
CREATE OR REPLACE PROCEDURE get_cost
(
item_id_in NUMBER,
part_id_in NUMBER,
ship_method_in NUMBER,
region_in NUMBER,
price_out OUT NUMBER,
is_override_out OUT VARCHAR2
) IS
v_weight NUMBER(12,4);
BEGIN
FOR c IN
(
SELECT mpo.ship_charge
FROM ff_override mpo
WHERE mpo.item_id = item_id_in
AND mpo.distributor_id = partner_id_in
AND mpo.shipping_method_no = ship_method_id_in
--AND mpo.region_id = region_id_in
) LOOP
price_out := c.ship_charge;
is_override_out := 'Y';
RETURN;
END LOOP;
END;
呼叫時也會很快的返回結果
現在所能肯定的是
該表的索引完好 匿名過程呼叫時候返回超快 而且執行計劃用到了unique index
在儲存過程中 連線條件中任意三列組合 也能返回較快結果 但是四列組合卻超級慢
而且我們用的是客戶端 不能使用10046事件 動態效能檢視也少的可憐 只有v$session v$longops沒有v$session_wait
還請各位一道分析一下
PS: 諸如 飄過 頂 之類的垃圾回覆就不要了 大家都是出來混的 又這麼忙 彼此理解一下
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-688348/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iOS FMDB有返回結果集和無返回結果集iOS
- 強制SQL在限定時間內返回結果SQL
- 事件迴圈(event loop)事件OOP
- JS事件迴圈Event LoopJS事件OOP
- Javascript 事件迴圈event loopJavaScript事件OOP
- JavaScript事件迴圈(Event Loop)JavaScript事件OOP
- JS 事件迴圈(Event Loop)JS事件OOP
- 事件迴圈(Event Loop)淺析事件OOP
- pl/sql for loop迴圈的使用SQLOOP
- lisp 裡的迴圈loop macroLispOOPMac
- Event Loop事件迴圈,看完你總會有點收穫!OOP事件
- 瀏覽器事件迴圈Event Loop瀏覽器事件OOP
- MyBatis 返回結果MyBatis
- jdbc 呼叫 sql server 的儲存過程時“該語句沒有返回結果集”的解決方法JDBCSQLServer儲存過程
- Flutter Flame 教程2 -- Game Loop遊戲迴圈FlutterGAMOOP遊戲
- JavaScript的事件迴圈(Event loop)(附圖)JavaScript事件OOP
- 淺談js的事件迴圈(Event Loop)JS事件OOP
- nodejs中的事件迴圈 - Event LoopNodeJS事件OOP
- 談談 Event Loop(事件迴圈)機制OOP事件
- for 迴圈境實現遊標LOOP提取OOP
- mysql 的procedure 中 loop迴圈的用法。MySqlOOP
- 瀏覽器與Node的事件迴圈(Event Loop)有何區別?瀏覽器事件OOP
- plsql_迴圈結構_do while_do unitl_while loop_end loop測試(一)SQLWhileOOP
- 一文梳理JavaScript 事件迴圈(Event Loop)JavaScript事件OOP
- 瀏覽器事件迴圈機制(event loop)瀏覽器事件OOP
- JavaScript深入之事件迴圈機制(event loop)JavaScript事件OOP
- 事件迴圈Event loop到底是什麼事件OOP
- 學習筆記之事件迴圈-Event loop筆記事件OOP
- [SceneKit專題]3-Render-Loop渲染迴圈OOP
- 時間遞增迴圈執行指令碼指令碼
- C語言——迴圈結構(for迴圈,while迴圈,do-while迴圈)C語言While
- 如何在非同步結果返回時進行跟蹤非同步
- 迴圈結構for
- 迴圈結構
- 最近有好長一段時間沒有敲程式碼了...
- ntpdate同步時間沒有反應
- JavaScript中Typeof返回的結果JavaScript
- AJAX的同步返回結果值