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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 事件迴圈(event loop)事件OOP
- 0165-loop 迴圈OOP
- iOS FMDB有返回結果集和無返回結果集iOS
- JavaScript事件迴圈(Event Loop)JavaScript事件OOP
- Javascript 事件迴圈event loopJavaScript事件OOP
- JS事件迴圈Event LoopJS事件OOP
- JS 事件迴圈(Event Loop)JS事件OOP
- cmd命令中輸入很多命令都沒有結果返回
- 事件迴圈(Event Loop)淺析事件OOP
- Event Loop事件迴圈,看完你總會有點收穫!OOP事件
- nodejs中的事件迴圈 - Event LoopNodeJS事件OOP
- 瀏覽器事件迴圈Event Loop瀏覽器事件OOP
- JavaScript的事件迴圈(Event loop)(附圖)JavaScript事件OOP
- 淺談js的事件迴圈(Event Loop)JS事件OOP
- 談談 Event Loop(事件迴圈)機制OOP事件
- 瀏覽器與Node的事件迴圈(Event Loop)有何區別?瀏覽器事件OOP
- 瀏覽器事件迴圈機制(event loop)瀏覽器事件OOP
- JavaScript深入之事件迴圈機制(event loop)JavaScript事件OOP
- 學習筆記之事件迴圈-Event loop筆記事件OOP
- 一文梳理JavaScript 事件迴圈(Event Loop)JavaScript事件OOP
- Flutter Flame 教程2 -- Game Loop遊戲迴圈FlutterGAMOOP遊戲
- 事件迴圈Event loop到底是什麼事件OOP
- MyBatis 返回結果MyBatis
- C語言——迴圈結構(for迴圈,while迴圈,do-while迴圈)C語言While
- MYSQL儲存過程-練習4 loop迴圈MySql儲存過程OOP
- 讓大家拿過來就能用且沒有迴圈引用的定時器TFQWeakTimer定時器
- 迴圈結構for
- 迴圈結構
- 11C++迴圈結構-for迴圈(1)C++
- 效能優化篇 - js事件迴圈機制(event loop)優化JS事件OOP
- 為什麼要有事件迴圈機制(Event Loop)事件OOP
- 瀏覽器和Node不同的事件迴圈(Event Loop)瀏覽器事件OOP
- Node.js中的事件迴圈(Event Loop),計時器(Timers)以及process.nextTick()Node.js事件OOP
- 最近有好長一段時間沒有敲程式碼了...
- 如何在非同步結果返回時進行跟蹤非同步
- 通用結果類用於返回響應結果
- Python返回多個結果Python
- 05迴圈結構
- 迴圈連結串列