Mysql PL/SQL函数锁定表+性能
我们已经编写了一个与mysql表交互并填充oracle模式表中数据的函数,该函数位于oracle端,但当我们试图执行它时,如果提到一个日期跨度,该函数不仅要花费大量时间执行,而且还要在填充的对象上创建一个锁 请让我知道什么可能是挫折提前感谢 --函数接受开始和结束日期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
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-该程序使用基于函数的索引得到了解决。