Plsql 有人能告诉我为什么这个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

执行以下存储过程需要20分钟。预计时间为2-3分钟。 为什么会这样? 有人能告诉我为什么这个sp需要这么多时间吗?可以做些什么让它运行得更快? 非常感谢。这个过程的逻辑是,它检查订单号是否存在于表中,如果不存在,则插入到该表中

 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.