Plsql 有人能告诉我为什么这个sp需要这么多时间吗?
执行以下存储过程需要20分钟。预计时间为2-3分钟。 为什么会这样? 有人能告诉我为什么这个sp需要这么多时间吗?可以做些什么让它运行得更快? 非常感谢。这个过程的逻辑是,它检查订单号是否存在于表中,如果不存在,则插入到该表中Plsql 有人能告诉我为什么这个sp需要这么多时间吗?,plsql,plsqldeveloper,Plsql,Plsqldeveloper,执行以下存储过程需要20分钟。预计时间为2-3分钟。 为什么会这样? 有人能告诉我为什么这个sp需要这么多时间吗?可以做些什么让它运行得更快? 非常感谢。这个过程的逻辑是,它检查订单号是否存在于表中,如果不存在,则插入到该表中 CREATE OR REPLACE PROCEDURE sp_load_order IS l_ds_ds_id data_source.ds_id%TYPE; l_carrier
CREATE OR REPLACE PROCEDURE sp_load_order
IS
l_ds_ds_id data_source.ds_id%TYPE;
l_carrier stage_na_shipment.haulier_name%TYPE;
l_vehicle_number stage_na_shipment.haulier_num%TYPE;
l_ship_date stage_na_shipment.ship_date`enter code here`%TYPE;
l_source_key VARCHAR2 (20);
l_source_key_1 VARCHAR2 (20);
l_quantity stage_na_shipment.quantity%TYPE;
l_ship_from stage_na_shipment.ship_from%TYPE;
l_prod_prod_id product.prod_prod_id%TYPE;
l_client stage_na_shipment.client%TYPE;
l_ord_id ordr.ord_id%TYPE;
l_sf_sf_id ship_from.sf_id%TYPE;
l_cust_cust_id customer.cust_cust_id%TYPE;
l_ord_stat_ord_stat_id ordr_status.ord_stat_id%TYPE;
l_le_le_id legal_entity.le_id%TYPE;
l_mkt_mkt_id market.mkt_id%TYPE;
l_code bill_type.code%TYPE;
l_ord_ord_id ordr.ord_id%TYPE;
l_ord_prod_id ordr_product.ord_prod_id%TYPE;
l_po_number stage_na_shipment.po_number%TYPE;
l_expct_ship_date stage_na_shipment.ship_date%TYPE;
l_bt_bt_id bill_type.bt_id%TYPE;
l_order_process_date stage_na_shipment.ship_date%TYPE;
l_storage_loc stage_na_shipment.stor_loc%TYPE;
l_ship_unit_code_8 stage_na_shipment.ship_unit_code_8%TYPE;
l_del_point stage_na_shipment.DEL_POINT%type;
l_r_num NUMBER;
n_1 NUMBER;
l_error_msg VARCHAR2 (500);
start_time timestamp;
end_time timestamp;
BEGIN
start_time:=systimestamp;
DBMS_OUTPUT.put_line ('Procedure started' ||start_time);
sp_log_entry (SYSDATE, 'SP_LOAD_ORDER', 'START', NULL, NULL, NULL);
start_time:=systimestamp;
DBMS_OUTPUT.put_line ('DS_ID start_time' ||start_time);
SELECT ds_id
INTO l_ds_ds_id
FROM data_source
WHERE ds_id = 1;
DBMS_OUTPUT.put_line ('DS_ID' || l_ds_ds_id);
end_time:=systimestamp;
DBMS_OUTPUT.put_line ('DS_ID start_time' ||end_time);
start_time:=systimestamp;
DBMS_OUTPUT.put_line ('ord_stat_id start_time' ||start_time);
SELECT ord_stat_id
INTO l_ord_stat_ord_stat_id
FROM ordr_status
WHERE ord_stat_id = 2;
DBMS_OUTPUT.put_line ('ORD_STAT_ID' || l_ord_stat_ord_stat_id);
end_time:=systimestamp;
DBMS_OUTPUT.put_line ('ORD_STAT_ID end_time' ||end_time);
start_time:=systimestamp;
DBMS_OUTPUT.put_line ('le_id start_time' ||start_time);
SELECT le_id
INTO l_le_le_id
FROM legal_entity
WHERE le_id = 1;
DBMS_OUTPUT.put_line ('LE_ID' || l_le_le_id);
end_time:=systimestamp;
DBMS_OUTPUT.put_line ('LE_ID end_time' ||end_time);
SELECT COUNT (*)
INTO l_r_num
FROM frontroom.ordr;
sp_log_entry (SYSDATE,
'SP_LOAD_ORDER',
'MESSAGE',
'FRONTROOM_BEF_INS',
l_r_num,
NULL
);
SELECT COUNT (*)
INTO l_r_num
FROM frontroom.ordr_product;
sp_log_entry (SYSDATE,
'SP_LOAD_ORDER',
'MESSAGE',
'ORDRPRODUCT_BEFORE_INS',
l_r_num,
NULL
);
DBMS_OUTPUT.put_line ('loop started' ||start_time);
FOR i IN (SELECT order_num_cos, ship_date, haulier_name, haulier_num,
po_number, stor_loc, ship_unit_code, ship_unit_code_8,
so_item, ship_from, del_point, currency, client, quantity
FROM stage_na_shipment)
LOOP
l_source_key := TO_CHAR (i.order_num_cos);
l_carrier := TO_CHAR (i.haulier_name);
l_vehicle_number := TO_CHAR (i.haulier_num);
l_source_key_1 := TO_CHAR (i.order_num_cos || i.so_item);
l_po_number := i.po_number;
l_storage_loc := TO_CHAR (i.stor_loc);
l_del_point :=i.del_point;
l_ship_date := i.ship_date;
l_ship_from := TO_CHAR (i.ship_from);
l_ship_unit_code_8 := TO_CHAR (i.ship_unit_code_8);
l_client := TO_CHAR (i.client);
DBMS_OUTPUT.put_line ('order_number' || i.order_num_cos);
BEGIN
start_time:=systimestamp;
DBMS_OUTPUT.put_line ('mkt_id start_time' ||start_time);
SELECT mkt_id INTO l_mkt_mkt_id
FROM market
WHERE code = DECODE (SUBSTR (l_client, 1, 4), 'US23', 'MM',
'US99', 'AFFCO' );
DBMS_OUTPUT.put_line ('MKT_ID' || l_mkt_mkt_id);
EXCEPTION
WHEN NO_DATA_FOUND
THEN
sp_log_entry (SYSDATE, 'SP_LOAD_ORDER', NULL, 'THE MKT ID NOT FOUND :',
NULL, NULL );
GOTO end_loop;
WHEN TOO_MANY_ROWS THEN
sp_log_entry (SYSDATE, 'SP_LOAD_ORDER', NULL, 'MKT ID TWO MANY ROWS FOUND :'||i.order_num_cos,
NULL, NULL );
WHEN others
THEN
sp_log_entry (SYSDATE, 'SP_LOAD_ORDER', NULL, SQLERRM, NULL, NULL );
END;
end_time:=systimestamp;
DBMS_OUTPUT.put_line ('mkt_id end_time' ||end_time);
start_time:=systimestamp;
DBMS_OUTPUT.put_line ('bt_id start_time' ||start_time);
BEGIN
IF i.quantity >= 0
THEN
l_code := 'O';
ELSE
l_code := 'C';
END IF;
SELECT bt_id INTO l_bt_bt_id FROM bill_type
WHERE code = l_code
AND ds_ds_id = l_ds_ds_id;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
sp_log_entry
(SYSDATE,
'SP_LOAD_ORDER',
NULL,
'BILL TYPE ID NOT FOUND',
NULL,
NULL
);
GOTO end_loop;
WHEN TOO_MANY_ROWS THEN
sp_log_entry (SYSDATE, 'SP_LOAD_ORDER', NULL, 'BILL TYPE ID TWO MANY ROWS FOUND :'||i.order_num_cos,
NULL, NULL );
WHEN others
THEN
sp_log_entry (SYSDATE,
'SP_LOAD_ORDER',
NULL,
SQLERRM,
NULL,
NULL
);
END;
DBMS_OUTPUT.put_line ('BT_ID :' || l_bt_bt_id);
end_time:=systimestamp;
DBMS_OUTPUT.put_line ('BT_ID end_time' ||end_time);
start_time:=systimestamp;
DBMS_OUTPUT.put_line ('prod_id start_time' ||start_time);
BEGIN
SELECT prod_prod_id
INTO l_prod_prod_id
FROM product
WHERE secondary_source_key = LTRIM (l_ship_unit_code_8, 0);
EXCEPTION
WHEN NO_DATA_FOUND
THEN
sp_log_entry (SYSDATE,
'SP_LOAD_ORDER',
NULL,
'THE PRODUCT ID ' ||i.ship_unit_code_8 ||' could not be found in product table :',
'order_num_cos = ' || i.order_num_cos
,
NULL
);
GOTO end_loop;
WHEN TOO_MANY_ROWS THEN
sp_log_entry (SYSDATE, 'SP_LOAD_ORDER', NULL, 'THE PRODUCT ID TWO MANY ROWS FOUND :' ||i.order_num_cos,
NULL, NULL );
WHEN OTHERS
THEN
sp_log_entry (SYSDATE,
'SP_LOAD_ORDER',
NULL,
SQLERRM,
i.ship_unit_code_8 || SQLERRM,
NULL
);
END;
DBMS_OUTPUT.put_line (' PROD_PROD_ID :' || l_prod_prod_id);
end_time:=systimestamp;
DBMS_OUTPUT.put_line ('PROD_ID end_time' ||end_time);
start_time:=systimestamp;
DBMS_OUTPUT.put_line ('sf_id start_time' ||start_time);
BEGIN
SELECT sf_id
INTO l_sf_sf_id
FROM ship_from
WHERE source_key = l_ship_from;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
sp_log_entry (SYSDATE,
'SP_LOAD_ORDER',
NULL,
'sf_id NOT FOUND',
NULL,
NULL
);
GOTO end_loop;
WHEN TOO_MANY_ROWS THEN
sp_log_entry (SYSDATE, 'SP_LOAD_ORDER', NULL, 'sf_id TWO MANY ROWS FOUND :'||i.order_num_cos,
NULL, NULL );
WHEN others
THEN
sp_log_entry (SYSDATE,
'SP_LOAD_ORDER',
NULL,
SQLERRM,
NULL,
NULL
);
END;
DBMS_OUTPUT.put_line ('SF_ID :' || l_sf_sf_id);
end_time:=systimestamp;
DBMS_OUTPUT.put_line ('sf_id end_time' ||end_time);
start_time:=systimestamp;
DBMS_OUTPUT.put_line ('cust_id start_time' ||start_time);
BEGIN
SELECT cust_id
INTO l_cust_cust_id
FROM customer
WHERE true_gcdb_source_key = to_char(i.del_point);
-- AND ds_ds_id = l_ds_ds_id;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
sp_log_entry (SYSDATE,
'SP_LOAD_ORDER',
NULL,
'THE CUST ID ' || l_del_point || 'COULD NOT BE FOUND IN THE CUSTOMER TABLE''order_num_cos = '||i.order_num_cos,
NULL,
NULL
);
GOTO end_loop;
WHEN TOO_MANY_ROWS THEN
sp_log_entry (SYSDATE, 'SP_LOAD_ORDER', NULL, 'cust_id TWO MANY ROWS FOUND :'||i.order_num_cos,
NULL, NULL );
WHEN others
THEN
sp_log_entry (SYSDATE,
'SP_LOAD_ORDER',
NULL,
SQLERRM,
NULL,
NULL
);
END;
DBMS_OUTPUT.put_line ('CUST_ID :' || l_cust_cust_id);
end_time:=systimestamp;
DBMS_OUTPUT.put_line ('CUST_ID end_time' ||end_time);
start_time:=systimestamp;
DBMS_OUTPUT.put_line ('INSERTING INTO frontroom.ordr' ||start_time);
BEGIN
INSERT INTO frontroom.ordr
(ord_number, ds_ds_id, erlst_ship_dt, carrier,
vehicle_number, ord_dt, source_key, sf_sf_id,
cust_cust_id, ord_stat_ord_stat_id, le_le_id,
mkt_mkt_id, sc_sc_id, ctrl_dt, po_number,
expct_ship_date, bt_bt_id, order_process_dt,
storage_loc)
SELECT l_source_key, l_ds_ds_id, i.ship_date, l_carrier,
l_vehicle_number, i.ship_date, l_source_key, l_sf_sf_id,
l_cust_cust_id, l_ord_stat_ord_stat_id, l_le_le_id,
l_mkt_mkt_id, 0, i.ship_date, l_po_number, i.ship_date,
l_bt_bt_id, i.ship_date, l_storage_loc
FROM DUAL
WHERE NOT EXISTS (SELECT 1--ord_number
FROM frontroom.ordr
WHERE ord_number = l_source_key);
EXCEPTION
WHEN OTHERS
THEN
l_error_msg := SQLERRM;
sp_log_entry (SYSDATE,
'SP_LOAD_ORDER',
NULL,
l_error_msg,
'order_num_cos = ' || i.order_num_cos,
NULL
);
GOTO end_loop;
END;
DBMS_OUTPUT.put_line ('Inserted into order table');
end_time:=systimestamp;
DBMS_OUTPUT.put_line ('Inserted into order table' ||end_time);
SELECT ord_id
INTO l_ord_ord_id
FROM frontroom.ordr
WHERE ord_number = l_source_key;
start_time:=systimestamp;
DBMS_OUTPUT.put_line ('INSERTING INTO frontroom.ordr_product' ||start_time);
BEGIN
INSERT INTO ordr_product
(volume, revenue, source_key, ord_ord_id, prod_prod_id,
local_currency)
SELECT i.ship_unit_code, 0, l_source_key_1, l_ord_ord_id,
l_prod_prod_id, i.currency
FROM DUAL
WHERE NOT EXISTS (
SELECT 1--ord_ord_id
FROM ordr_product
WHERE ord_ord_id =
(SELECT ord_id
FROM ordr
WHERE ord_number = l_source_key));
EXCEPTION
WHEN OTHERS
THEN
l_error_msg := SQLERRM;
sp_log_entry (SYSDATE,
'SP_LOAD_ORDER',
NULL,
l_error_msg,
'order_num_cos = ' || i.order_num_cos,
NULL
);
GOTO end_loop;
END;
n_1 := n_1 + 1;
if n_1 = 100 then
COMMIT;
n_1 := 0;
end if;
<<end_loop>>
null;
END LOOP;
end_time:=systimestamp;
DBMS_OUTPUT.put_line ('Inserted into order table' ||end_time);
end_time:=systimestamp;
DBMS_OUTPUT.put_line ('Loop ends' ||end_time);
SELECT COUNT (*)
INTO l_r_num
FROM frontroom.ordr;
sp_log_entry (SYSDATE,
'SP_LOAD_ORDER',
'MESSAGE',
'FRONTROOM_AFTER_INS',
l_r_num,
NULL
);
SELECT COUNT (*)
INTO l_r_num
FROM frontroom.ordr_product;
sp_log_entry (SYSDATE,
'SP_LOAD_ORDER',
'MESSAGE',
'ORDRPRODUCT_AFTER_INS',
l_r_num,
NULL
);
sp_log_entry (SYSDATE, 'SP_LOAD_ORDER', 'COMPLETE', NULL, NULL, NULL);
end_time:=systimestamp;
DBMS_OUTPUT.put_line ('Procedure ends' ||end_time);
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
l_error_msg := SQLERRM;
sp_log_entry (SYSDATE, 'SP_LOAD_ORDER', NULL, l_error_msg, NULL, NULL);
END sp_load_order;
/
创建或替换程序sp\u加载顺序
是
l_ds_ds_id数据_源。ds_id%类型;
l_承运人分期装运。承运人名称%类型;
l_车辆编号分期装运。运输商数量百分比类型;
l_ship_date stage_na_Shipping.ship_date`在此处输入代码`%TYPE;
l_源_键VARCHAR2(20);
l_源_键_1 VARCHAR2(20);
l\u数量阶段\u未装运。数量%类型;
l_从阶段发货。从%类型发货;
l_prod_prod_id产品。prod_prod_id%类型;
l_客户阶段_na_发货。客户%类型;
订单id订单id%类型;
l_sf_sf_id ship_from.sf_id%类型;
l_cust_cust_id客户。cust_cust_id%类型;
l_ord_stat_ord_stat_id ordr_status.ord_stat_id%类型;
l_le_le_id法律实体。le_id%类型;
l_mkt_mkt_id market.mkt_id%类型;
l\ U代码票据类型。代码%类型;
l_ord_ord_id ordr.ord_id%类型;
订单生产id订单产品。订单生产id%类型;
l_po_编号分期装运。po_编号%类型;
出口装运日期阶段装运。装运日期%类型;
l_bt_bt_id票据类型。bt_id%类型;
l\订单\流程\日期阶段\未发货。发货日期%类型;
l_储存_loc阶段_na_装运。储存_loc%类型;
l_装运单元代码_8分期装运。装运单元代码_8%类型;
l_del_point stage_na_Shipping.del_point%类型;
l_r_num编号;
n_1号;
l_error_msg VARCHAR2(500);
开始时间戳;
结束时间时间戳;
开始
开始时间:=systimestamp;
DBMS_OUTPUT.put_line('过程已启动'| |启动_time);
sp_日志_条目(SYSDATE,'sp_加载顺序','START',NULL,NULL,NULL);
开始时间:=systimestamp;
DBMS_OUTPUT.put_line('DS_ID start_time'| | start_time);
选择ds\U id
进入l_d_d_id
从数据源
其中ds_id=1;
DBMS_OUTPUT.put_line('DS_ID'| | l_DS_DS_ID);
结束时间:=系统时间戳;
DBMS_OUTPUT.put_line('DS_ID start_time'| | end_time);
开始时间:=systimestamp;
DBMS_OUTPUT.put_line('ord_stat_id start_time'| start_time);
选择ord\U stat\U id
输入l_ord_stat_ord_stat_id
从ordr_状态
其中ord_stat_id=2;
DBMS_OUTPUT.put_line('ORD_STAT_ID'| l_ORD_STAT_ORD_STAT_ID);
结束时间:=系统时间戳;
DBMS_OUTPUT.put_line('ORD_STAT_ID end_time'| end_time);
开始时间:=systimestamp;
DBMS_OUTPUT.put_line('le_id start_time'| | start_time);
选择le_id
进入l_le_le_id
来自法律实体
其中le_id=1;
DBMS_OUTPUT.put_line('LE_ID'| | l_LE_LE_ID);
结束时间:=系统时间戳;
DBMS_OUTPUT.put_line('LE_ID end_time'| | end_time);
选择计数(*)
进入l_r_num
从frontroom.ordr;
sp_日志_条目(SYSDATE,
“SP加载顺序”,
"讯息",,
“前厅”,
l_r_num,
无效的
);
选择计数(*)
进入l_r_num
来自frontroom.ordr_产品;
sp_日志_条目(SYSDATE,
“SP加载顺序”,
"讯息",,
“之前的订单产品”,
l_r_num,
无效的
);
DBMS_OUTPUT.put_line('loop start'| | start_time);
对于i IN(选择订单号、发货日期、承运商名称、承运商编号、,
采购订单编号、仓库位置、船舶单元代码、船舶单元代码8、,
因此,商品、发货地、交货点、货币、客户、数量
从第二阶段(装运)
环
l_source_key:=TO_CHAR(即订单数量);
l_承运人:=至_CHAR(即承运人名称);
l_车辆编号:=至_CHAR(即搬运工编号);
l_source_key_1:=TO_CHAR(i.order_num_cos | i.so_item);
l_po_编号:=i.po_编号;
l_存储位置:=至字符(i.stor_loc);
l_del_点:=i.del_点;
l_发货日期:=i.发货日期;
l_ship_from:=TO_CHAR(i.ship_from);
l_装运单元代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码代码;
l_client:=TO_CHAR(i.client);
DBMS_OUTPUT.put_line('order_number'| | i.order_num_cos);
开始
开始时间:=systimestamp;
DBMS_OUTPUT.put_line('mkt_id start_time'| | start_time);
将mkt_id选择到l_mkt_mkt_id中
来自市场
其中代码=解码(SUBSTR(l_客户端,1,4),‘US23’、‘MM’,
‘US99’、‘AFFCO’;
DBMS_OUTPUT.put_line('MKT_ID'| l_MKT_MKT_ID);
例外情况
当找不到数据时
然后
sp_log_条目(SYSDATE,'sp_LOAD_ORDER',NULL,'未找到MKT ID:',
空,空);
转到结束循环;
当排得太多的时候
sp|u log_条目(SYSDATE,'sp_LOAD_ORDER',NULL,'MKT ID找到两行多:'| i.ORDER_num_cos,
空,空);
当别人
然后
select username, status, sid, serial# from v$session
exec dbms_monitor.session_trace_enable(session_id=>3,serial_num=>5027,binds=>true,waits=>true);
exec dbms_monitor.session_trace_disable(session_id=>3,serial_num=>5027);
SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Default Trace File';
tkprof <source trace file> <output file>
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 9 0.00 0.00 0 0 0 0
Execute 9 0.00 0.01 1 32 0 1
Fetch 3 0.00 0.00 0 32 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 21 0.00 0.01 1 64 0 2
1 session in tracefile.
9 user SQL statements in trace file.
2 internal SQL statements in trace file.
11 SQL statements in trace file.
10 unique SQL statements in trace file.
504 lines in trace file.
4 elapsed seconds in trace file.