Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql PL/SQL函数锁定表+性能_Mysql_Performance_Plsql - Fatal编程技术网

Mysql PL/SQL函数锁定表+性能

Mysql PL/SQL函数锁定表+性能,mysql,performance,plsql,Mysql,Performance,Plsql,我们已经编写了一个与mysql表交互并填充oracle模式表中数据的函数,该函数位于oracle端,但当我们试图执行它时,如果提到一个日期跨度,该函数不仅要花费大量时间执行,而且还要在填充的对象上创建一个锁 请让我知道什么可能是挫折提前感谢 --函数接受开始和结束日期 create or replace FUNCTION F_ANLY_USR_VIS_LOG_TEST(startDate DATE, endDate DATE) RETURN VARCHAR

我们已经编写了一个与mysql表交互并填充oracle模式表中数据的函数,该函数位于oracle端,但当我们试图执行它时,如果提到一个日期跨度,该函数不仅要花费大量时间执行,而且还要在填充的对象上创建一个锁

请让我知道什么可能是挫折提前感谢

--函数接受开始和结束日期

       create or replace
        FUNCTION F_ANLY_USR_VIS_LOG_TEST(startDate DATE, endDate DATE) 
    RETURN VARCHAR2 IS
    PRAGMA AUTONOMOUS_TRANSACTION;
    v_return VARCHAR2(1000) :='';
    trunc_table VARCHAR2(300);
    sql_query VARCHAR2(1000);
    portalvisitid ANLY_USR_VIS_LOG_TEMPER.PORTAL_VISIT_ID%TYPE;
    sourcesystemid ANLY_USR_VIS_LOG_TEMPER.SOURCE_SYSTEM_ID%TYPE;
    perspectiveheaderid ANLY_USR_VIS_LOG_TEMPER.PERSPECTIVE_HEADER_ID%TYPE;
    frameworksectionid ANLY_USR_VIS_LOG_TEMPER.FRAMEWORK_SECTION_ID%TYPE;
    interactionactionid ANLY_USR_VIS_LOG_TEMPER.INTERACTION_ACTION_ID%TYPE;
    valuecontextid ANLY_USR_VIS_LOG_TEMPER.VALUE_CONTEXT_ID%TYPE;
    valuetypeid ANLY_USR_VIS_LOG_TEMPER.VALUE_TYPE_ID%TYPE;
    searchnextpage ANLY_USR_VIS_LOG_TEMPER.SEARCH_NEXT_PAGE%TYPE;
    action ANLY_USR_VIS_LOG_TEMPER.ACTION_ID%TYPE := GET_ACTION_ID('Created');
    portal_actionid VARCHAR2(1000);
    portal_actionname VARCHAR2(1000);
    portal_actiontype VARCHAR2(1000);
    portal_visit_logtime VARCHAR2(1000);
    source_systemid VARCHAR2(1000);
    referer_domainname VARCHAR2(1000);
    perspective_headerid VARCHAR2(1000);
    valueconid VARCHAR2(1000);
    valuelist VARCHAR2(1000);
    ssotoken VARCHAR2(1000);
    log_actionurl VARCHAR2(1000);
    lastactiontime VARCHAR2(1000);
    result_source NUMBER := 0;
    result_perspective NUMBER := 0;
    result_valuecontext NUMBER := 0;
    result_interactionaction NUMBER:= 0;
    result_frameworksection NUMBER:= 0;
    result_searchnext NUMBER:= 0;
    result_data NUMBER:= 0;
    vallist VARCHAR2(1000);
    dtconid VARCHAR2(1000);
    dtvallist VARCHAR2(1000);
    idactionurl VARCHAR2(1000);
    idactionurlref VARCHAR2(1000);
    prevurl VARCHAR2(1000);
    TYPE usermappingcur  IS REF CURSOR;

    c2 usermappingcur;
    CURSOR c1 is SELECT plv."idvisit" FROM "piwik_log_visit_base"@piwikuat plv WHERE 
    TO_DATE(TO_CHAR(TO_TIMESTAMP(regexp_replace(plv."visit_first_action_time",'([[:cntrl:]])|(^\t)',''),'YYYY-MM-DD HH24:MI:SS'),'DD-MON-YYYY'),'DD-MON-YYYY')>=TO_DATE(TO_CHAR(TO_TIMESTAMP(startDate, 'DD-Mon-RR HH:MI:SS.FF AM'),'DD-MON-YYYY'),'DD-MON-YYYY')
    AND TO_DATE(TO_CHAR(TO_TIMESTAMP(regexp_replace(plv."visit_first_action_time",'([[:cntrl:]])|(^\t)',''),'YYYY-MM-DD HH24:MI:SS'),'DD-MON-YYYY'),'DD-MON-YYYY')  < TO_DATE(TO_CHAR(TO_TIMESTAMP(endDate, 'DD-Mon-RR HH:MI:SS.FF AM'),'DD-MON-YYYY'),'DD-MON-YYYY') ;
    --plv."idvisit" =28907;
    BEGIN
     -- <<Truncate the ANLY_USR_VIS_LOG_TEMPER (ANALYTICS TABLE) >>
     trunc_table :=    'TRUNCATE TABLE ANLY_USR_VIS_LOG_TEMPER';
     EXECUTE IMMEDIATE trunc_table;
     OPEN c1;
       LOOP   
         FETCH c1 INTO portalvisitid;
            --exit when no more records found in cursor
            exit when c1%notfound;
           OPEN c2 for 
           SELECT 
            regexp_replace(pla."idaction",'([[:cntrl:]])|(^\t)','') ,
            regexp_replace(pla."name",'([[:cntrl:]])|(^\t)','') ,
            regexp_replace(pla."type",'([[:cntrl:]])|(^\t)','') ,
            TO_TIMESTAMP(regexp_replace(plva."server_time",'([[:cntrl:]])|(^\t)',''),'YYYY-MM-DD HH24:MI:SS') ,
            regexp_replace(plva."custom_var_v3",'([[:cntrl:]])|(^\t)','') ,
            regexp_replace(plv."referer_url",'([[:cntrl:]])|(^\t)','') ,
            regexp_replace(plva."custom_var_k9",'([[:cntrl:]])|(^\t)','') ,
            regexp_replace(plva."custom_var_k1",'([[:cntrl:]])|(^\t)','')  ,
            regexp_replace(plva."custom_var_v1",'([[:cntrl:]])|(^\t)','') ,
            regexp_replace(plv."custom_var_v3",'([[:cntrl:]])|(^\t)','') ,
            regexp_replace(pla."url_prefix",'([[:cntrl:]])|(^\t)','') ,
            TO_TIMESTAMP(regexp_replace(plv."visit_last_action_time" ,'([[:cntrl:]])|(^\t)',''),'YYYY-MM-DD HH24:MI:SS'),
            regexp_replace(plva."custom_var_v9",'([[:cntrl:]])|(^\t)',''),
            regexp_replace(plva."custom_var_k6",'([[:cntrl:]])|(^\t)',''),
            regexp_replace(plva."custom_var_v6",'([[:cntrl:]])|(^\t)',''),
            regexp_replace(plva."idaction_url",'([[:cntrl:]])|(^\t)',''),
            regexp_replace(plva."idaction_url_ref",'([[:cntrl:]])|(^\t)','') 
            FROM "piwik_log_link_base"@piwikuat plva, "piwik_log_action_base"@piwikuat pla,"piwik_log_visit_base"@piwikuat plv
            where TO_NUMBER(regexp_replace(plv."idvisit",'([[:cntrl:]])|(^\t)','')) = TO_NUMBER(regexp_replace(plva."idvisit",'([[:cntrl:]])|(^\t)',''))
            AND TO_NUMBER(regexp_replace( plva."idaction_name",'([[:cntrl:]])|(^\t)','')) = To_NUMBER(regexp_replace(pla."idaction",'([[:cntrl:]])|(^\t)',''))
            AND plva."idvisit" = portalvisitid;
            LOOP
            --<< FETCH DETAILS DETAILS INTO VARIABLES
            FETCH c2 INTO portal_actionid,portal_actionname,portal_actiontype,portal_visit_logtime,source_systemid,referer_domainname,perspective_headerid,
            valueconid,valuelist,ssotoken,log_actionurl,lastactiontime,vallist,dtconid,dtvallist,idactionurl,idactionurlref;
             --exit when no more records found in cursor
             exit when c2%notfound; 
             result_source := 0;
             result_perspective := 0;
             result_valuecontext := 0;
             result_interactionaction := 0;
             result_frameworksection := 0;
             result_searchnext := 0;
             result_data := 0;

             ---RE-INITIALISING VARIABLES FOR AVOIDING DUPLICACY
             perspectiveheaderid := NULL;
             valuecontextid := NULL;
             valuetypeid := NULL;
             interactionactionid := NULL;
             searchnextpage := '';
             frameworksectionid := NULL;
             ----CHECK FOR SOURCE SYSTEM ID
             SELECT COUNT(*) INTO result_source FROM LISTLOOKUP WHERE type = 'source_system_id' and lower(description) = lower(nvl(source_systemid,''));

             -----PROCESSING FOR SOURCE SYSTEM ID
             IF result_source = 1 THEN
              SELECT ID INTO sourcesystemid FROM LISTLOOKUP WHERE type = 'source_system_id' and lower(description) = lower(nvl(source_systemid,''));
             ELSE
              sourcesystemid := 1;
             END IF;

             -----PROCESSING FOR PERSPECTIVE HEADER ID
             SELECT COUNT(*) INTO result_perspective FROM LISTLOOKUP WHERE TYPE = 'perspective_header_id' AND LOWER(DESCRIPTION) = LOWER(NVL(perspective_headerid,''));
             IF result_perspective = 1 THEN
             SELECT ID INTO perspectiveheaderid FROM LISTLOOKUP WHERE TYPE = 'perspective_header_id' AND LOWER(DESCRIPTION) = LOWER(NVL(perspective_headerid,''));
             END IF;

             -----PROCESSING VALUE CONTEXT ID
             IF valueconid IS NOT NULL THEN
             SELECT COUNT(*) INTO result_valuecontext FROM LISTLOOKUP WHERE TYPE = 'value_context_id' AND LOWER(TAGS) LIKE '%'||LOWER(valueconid)||'%';
             END IF;

             IF result_valuecontext = 1 THEN
              SELECT ID INTO valuecontextid FROM LISTLOOKUP WHERE TYPE = 'value_context_id' AND LOWER(TAGS) LIKE '%'||LOWER(valueconid)||'%';
              SELECT  decode(TRIM(TRANSLATE(lower(valuelist),' +.0123456789', ' ')), NULL,1,2) INTO valuetypeid FROM DUAL;
             ELSE
               ------CHECK ON CUSTOM VAR K9 FOR VALUE CONTEXT ID
               IF perspective_headerid IS NOT NULL THEN
               SELECT COUNT(*) INTO result_valuecontext FROM LISTLOOKUP WHERE TYPE = 'value_context_id' AND LOWER(TAGS) LIKE '%'||LOWER(perspective_headerid)||'%';
               END IF;

               IF result_valuecontext = 1 THEN
                SELECT ID INTO valuecontextid FROM LISTLOOKUP WHERE TYPE = 'value_context_id' AND LOWER(TAGS) LIKE '%'||LOWER(perspective_headerid)||'%';
                valuelist := vallist;
                SELECT  decode(TRIM(TRANSLATE(lower(vallist),' +.0123456789', ' ')), NULL,1,2) INTO valuetypeid FROM DUAL;
                ELSE
                -----CHECK ON DTCONID AND DT VALUE LIST
                IF dtconid IS NOT NULL THEN
                    SELECT COUNT(*) INTO result_valuecontext FROM LISTLOOKUP WHERE TYPE = 'value_context_id' AND LOWER(TAGS) LIKE '%'||LOWER(dtconid)||'%';
                END IF;
                IF result_valuecontext = 1 THEN
                    SELECT ID INTO valuecontextid FROM LISTLOOKUP WHERE TYPE = 'value_context_id' AND LOWER(TAGS) LIKE '%'||LOWER(dtconid)||'%';
                    valuelist := dtvallist;
                    SELECT  decode(TRIM(TRANSLATE(lower(dtvallist),' +.0123456789', ' ')), NULL,1,2) INTO valuetypeid FROM DUAL;
                ELSE
                 --- no data to be inserted as no context id match i.e. value list should also be be null
                 valuelist := null;
                END IF;
              END IF;          
             END IF;


             -------PROCESSING FOR INTERACTION_ID
             IF valueconid IS NOT NULL THEN
                 SELECT COUNT(*) INTO result_interactionaction FROM LISTLOOKUP WHERE TYPE = 'interaction_action_id' AND LOWER(TAGS) LIKE '%'||LOWER(valueconid)||'%';
             END IF;    
             IF result_interactionaction = 1 THEN
                SELECT ID INTO interactionactionid FROM LISTLOOKUP WHERE TYPE = 'interaction_action_id' AND LOWER(TAGS) LIKE '%'||LOWER(valueconid)||'%';
             ELSE
              ----APPLYING CHECK FOR SEARCH PAGE
                IF portal_actionname IS NOT NULL THEN
                 SELECT COUNT(*) INTO result_interactionaction FROM LISTLOOKUP WHERE TYPE = 'interaction_action_id' AND LOWER(TAGS) LIKE '%'||LOWER(portal_actionname)||'%';
                END IF;
                IF result_interactionaction = 1 THEN
                 --- IF THE ID IS FOUND THEN
                 SELECT ID INTO interactionactionid FROM LISTLOOKUP WHERE TYPE = 'interaction_action_id' AND LOWER(TAGS) LIKE '%'||LOWER(portal_actionname)||'%';
                 ELSE 
                 ----APPLYING CHECKS FOR OTHER VARIABLES WHICH ARE RECORDED IN CUSTOM_VAR_K9
                    IF perspective_headerid IS NOT NULL THEN
                    SELECT COUNT(*) INTO result_interactionaction FROM LISTLOOKUP WHERE TYPE = 'interaction_action_id' AND LOWER(TAGS) LIKE '%'||LOWER(perspective_headerid)||'%';
                    END IF;
                    IF result_interactionaction = 1 THEN
                        SELECT ID INTO interactionactionid FROM LISTLOOKUP WHERE TYPE = 'interaction_action_id' AND LOWER(TAGS) LIKE '%'||LOWER(perspective_headerid)||'%';
                    ELSE 
                        ----APPLYING CHECK ON SORT OPERATIONS VIA MY ALERTS / OTHER VARIABLES WHICH ARE BEEN STORED IN CUSTOM_VAR_V1
                        IF valuelist IS NOT NULL THEN
                           SELECT COUNT(*) INTO result_interactionaction FROM LISTLOOKUP WHERE TYPE = 'interaction_action_id' AND LOWER(TAGS) LIKE '%'||LOWER(valuelist)||'%';
                        END IF;
                        IF result_interactionaction = 1 THEN
                          SELECT ID INTO interactionactionid FROM LISTLOOKUP WHERE TYPE = 'interaction_action_id' AND LOWER(TAGS) LIKE '%'||LOWER(valuelist)||'%';
                          ----CHECK FOR CUSTOM_VAR_K6 FOR REST OF THE SCENARIOS
                          ELSE
                            IF dtconid IS NOT NULL THEN
                             SELECT COUNT(*) INTO result_interactionaction FROM LISTLOOKUP WHERE TYPE = 'interaction_action_id' AND LOWER(TAGS) LIKE '%'||LOWER(dtconid)||'%';
                            END IF;
                            IF result_interactionaction = 1 THEN
                              SELECT ID INTO interactionactionid FROM LISTLOOKUP WHERE TYPE = 'interaction_action_id' AND LOWER(TAGS) LIKE '%'||LOWER(dtconid)||'%';
                            END IF;
                        END IF;
                    END IF;
                END IF; 
             END IF;

             -------PROCESSING FOR SEARCH NEXT PAGE  result_searchnext searchnextpage
             IF  idactionurl IS NOT NULL THEN

                SELECT COUNT(*) INTO result_data FROM "piwik_log_action_base"@piwikuat pla where 
                To_NUMBER(regexp_replace(pla."idaction",'([[:cntrl:]])|(^\t)','')) = To_NUMBER(regexp_replace(idactionurl,'([[:cntrl:]])|(^\t)',''));

                IF result_data > 0  THEN
                    SELECT regexp_replace(pla."name",'([[:cntrl:]])|(^\t)','') INTO searchnextpage FROM "piwik_log_action_base"@piwikuat pla where 
                    To_NUMBER(regexp_replace(pla."idaction",'([[:cntrl:]])|(^\t)','')) = To_NUMBER(regexp_replace(idactionurl,'([[:cntrl:]])|(^\t)',''));
                END IF;

             END IF;

            --- RESETTING THE VARIABLE TO ZERO

            result_data := 0;

            ----PROCESS FRAMEWORK SECTION ID
            IF idactionurlref IS NOT NULL THEN
             SELECT COUNT(*) INTO result_data FROM "piwik_log_action_base"@piwikuat pla where 
             To_NUMBER(regexp_replace(pla."idaction",'([[:cntrl:]])|(^\t)','')) = To_NUMBER(regexp_replace(idactionurlref,'([[:cntrl:]])|(^\t)',''));
             IF result_data > 0  THEN
                SELECT regexp_replace(pla."name",'([[:cntrl:]])|(^\t)','') INTO prevurl FROM "piwik_log_action_base"@piwikuat pla where 
                To_NUMBER(regexp_replace(pla."idaction",'([[:cntrl:]])|(^\t)','')) = To_NUMBER(regexp_replace(idactionurlref,'([[:cntrl:]])|(^\t)',''));
             END IF;
             IF prevurl IS NOT NULL THEN
             select COUNT(*) INTO result_frameworksection FROM LISTLOOKUP WHERE TYPE = 'framework_section_id' and instr(LOWER(prevurl),lower(tags),1)>0;
             END IF;
             IF result_frameworksection =1 THEN
              SELECT ID INTO frameworksectionid FROM LISTLOOKUP WHERE TYPE = 'framework_section_id' and instr(LOWER(prevurl),lower(tags),1)>0;
             END IF;

            END IF;

 --- inserting data into table          
            INSERT INTO ANLY_USR_VIS_LOG_TEMPER(portal_visit_id,portal_action_id,portal_action_name,portal_action_type,portal_visit_log_time,source_system_id,perspective_header_id,framework_section_id,interaction_action_id,interaction_type_id,value_context_id,value_type_id,value_list,search_next_page,sso_token,log_action_url,last_update_date,action_id,REFERER_DOMAIN_NAME)
            VALUES(portalvisitid,portal_actionid,portal_actionname,portal_actiontype,portal_visit_logtime,sourcesystemid,perspectiveheaderid,frameworksectionid,interactionactionid,null,valuecontextid,valuetypeid,valuelist,searchnextpage,ssotoken,log_actionurl,lastactiontime,action,referer_domainname);

            END LOOP;
           CLOSE c2;        
       END LOOP;
     COMMIT;     
     v_return := 'SUCCESS';
     CLOSE c1;
     RETURN v_return;
     EXCEPTION
     WHEN OTHERS THEN
     v_return := SQLERRM;
     ROLLBACK;
     RETURN v_return;
    END F_ANLY_USR_VIS_LOG_TEST;
    /

除非定义了适当的基于函数的索引,否则各种SELECT语句的WHERE子句中的所有这些REGEXP_REPLACE调用都将导致全表扫描。我猜您没有定义这种基于函数的索引,因此您的查询正在扫描有问题的表,对每一行执行多个REGEXP_REPLACE调用,因此性能不佳,表被锁定。也许您可以在表上定义适当的基于函数的索引,或者去掉WHERE子句中的REGEXP_REPLACE调用?您是否运行了解释计划?感谢Bob和OldProgrammer-该程序使用基于函数的索引得到了解决。