有人能帮我优化下面的mysql存储过程吗?它正在破坏我的服务器



/*下面将获取所有已完成的任务。*/

insert ignore into NodeInstanceLog_Dump
select  nil.id, nil.connection, nil.log_date, nil.externalId,
nil.nodeContainerId, nil.nodeId ,nil.nodeInstanceId,
coalesce(nil.nodename, nil3.name)nodename, nil.nodeType, nil.processId,
nil.processInstanceId , nil.referenceId, nil.slaCompliance, nil.sla_due_date,
nil.type, nil.workItemId, 0 as activeStatus
from  bpm.NodeInstanceLog nil
inner join  bpm.VariableInstanceLog vil
ON nil.processInstanceId=vil.processInstanceId
and  vil.value='Success'
and  vil.variableId in ('oltOrderStatus','orderStatus')
and  nodeType='EndNode'
and  type=0
left join  
(
SELECT  distinct nil2.*,nil1.nodeName name
from  bpm.NodeInstanceLog nil1 inner join
(
SELECT  max(convert(nodeinstanceid,signed))id,processInstanceId
from  bpm.NodeInstanceLog
where  nodetype='HumanTaskNode'group by processInstanceId
)nil2  ON nil1.nodeinstanceid=nil2.id
and  nil1.processInstanceId=nil2.processInstanceId
)nil3  ON nil.processInstanceId=nil3.processInstanceId;

/*下面将获取所有中止的任务。*/

insert ignore into NodeInstanceLog_Dump
select  nil.id, nil.connection, nil.log_date, nil.externalId,
nil.nodeContainerId, nil.nodeId ,nil.nodeInstanceId,
coalesce(nil.nodename, nil3.name)nodename, nil.nodeType, nil.processId,
nil.processInstanceId , nil.referenceId, nil.slaCompliance, nil.sla_due_date,
nil.type, nil.workItemId, 0 as activeStatus
from  bpm.NodeInstanceLog nil
inner join  bpm.VariableInstanceLog vil
ON nil.processInstanceId=vil.processInstanceId
and  vil.value='Aborted'
and  vil.variableId in ('oltOrderStatus','orderStatus')
and  nodeType='EndNode'
and  type=0
left join  
(
SELECT  distinct nil2.*,nil1.nodeName name
from  bpm.NodeInstanceLog nil1 inner join
(
SELECT  max(convert(nodeinstanceid,signed))id,processInstanceId
from  bpm.NodeInstanceLog
where  nodetype='HumanTaskNode'group by processInstanceId
)nil2  ON nil1.nodeinstanceid=nil2.id
and  nil1.processInstanceId=nil2.processInstanceId
)nil3  ON nil.processInstanceId=nil3.processInstanceId;

(来自评论(

Table:NodeInstanceLog Columns: 
id bigint(20) AI PK 
connection varchar(255) 
log_date datetime 
externalId varchar(255) 
nodeId varchar(255) 
nodeInstanceId varchar(255) 
nodeName varchar(255) 
nodeType varchar(255) 
processId varchar(255) 
processInstanceId bigint(20)
sla_due_date datetime 
slaCompliance int(11) 
type int(11) 
workItemId bigint(20) 
nodeContainerId varchar(255) 
referenceId bigint(20)

其中一些索引可能会有所帮助:

NodeInstanceLog:  INDEX(processInstanceId)
NodeInstanceLog:  INDEX(nodeinstanceid,  nodeName, processInstanceId)
VariableInstanceLog:  INDEX(processInstanceId,  value, variableId)

添加复合索引时,请使用具有相同前导列的DROP索引。也就是说,当您同时拥有INDEX(a(和INDEX(a,b(时,抛出前者。

max(convert(nodeinstanceid,signed))——这是否意味着nodeinstanceidVARCHAR,但需要作为一个数字进行比较?我建议您找到一种方法将其存储在INT或其他类型的数字列中;这可以使查询运行得更快。此外,该列在NodeInstanceLog中吗?是PRIMARY KEY吗?表现在有哪些索引(包括PK(?

为了帮助读者理解查询,请使用ON指定表的关联方式,使用WHERE进行筛选。

请用它们的表别名来限定所有列——例如,我不知道typenodeType在哪个表中。因此,上面的INDEX建议可能不完整。

最新更新