我目前正在尝试寻找一种优化规则的方法,但是很遗憾,目前我还没有找到任何优化方法,首先让我向您展示一些解释的规则:
rule "count_asset"
dialect "mvel"
when
RuleConfig( ref_rule_code == "count_asset", $paramValue:param_value, $operator:ref_rule_operator_code, $value:value, $target:ref_rule_target_code )
RefRuleTarget ( code == $target, $targetUsage:usage_in_rules.split("\\s*,\\s*"))
CustomerRefSubscription ( $customerId:customer_id, ref_subscription_code == 'PAT', deactivated_at == null )
Number( Utils.compare( String.valueOf(this), $operator, $value ) == true ) from accumulate (
Asset($tableId:id, customer_id == $customerId, ($paramValue == null || ref_asset_category == $paramValue))
and exists VAssetWithOwner( id == $tableId, $targetUsage contains owner ), count(1))
then
RuleResult $ruleResult = new RuleResult($customerId ...);
insert( $ruleResult );
end
此规则的作用:它将找到所有$ customerId,其资产数量符合RuleConfig提供的所有条件。
数据示例:
RuleConfig( ref_rule_code == "count_asset", param_value = 'A', ref_rule_operator_code = '==', value = 1, ref_rule_target_code = 'G1' )
RefRuleTarget ( code = 'G1', usage_in_rules = 'A,B,C,D' )
CustomerRefSubscription ( customer_id = 1, ...)
CustomerRefSubscription ( customer_id = 2, ...)
Asset( id = 1, customer_id = 1, ref_asset_category = A)
VAssetWithOwner( id = 1, owner = A )
VAssetWithOwner( id = 1, owner = B)
Asset( id = 2, customer_id = 1, ref_asset_category = A)
VAssetWithOwner( id = 1, owner = E)
Asset( id = 3, customer_id = 1, ref_asset_category = B)
VAssetWithOwner( id = 1, owner = A)
Asset( id = 4, customer_id = 2, ref_asset_category = B)
在这里,唯一符合所有条件的customer_id是1:他只有一个(== 1)类别A的资产,且所有者在(A,B,C,D)中]]
如果我仅在数据库中插入一个RuleConfig,例如该示例,那么我运行drools(作为带有fireAllRules()的Java独立应用程序),需要199毫秒才能为我提供符合条件的完整客户列表。但是我插入的RuleConfig越多,花费的时间就越多...
Number of Rule Config Time in ms 1 199 2 1960 3 7652 4 15156 5 35185 6 56447 7 68047 8 78541 9 86769 10 94623 11 108515 12 117124 13 129775
仅需13条规则配置,超过2分钟。我的数据库包含大约1200个CustomerRefSubscription,28000个资产和36000个VAssetWithOwner。
如何改善此规则?我的数据库中可能有一百多个规则配置,以这种方式,要花一些小时才能返回一些结果...
我已经发现删除此部分“并且存在VAssetWithOwner(id == $ tableId,$ targetUsage包含所有者)”通过13条规则配置达到129 000ms至900ms,这是一个很大的改进,但我确实需要此过滤器。 ..我不能只是将其删除...
谢谢,纪尧姆
我目前正在尝试寻找一种优化规则的方法,但是很遗憾,目前我还没有找到任何规则,首先让我向您展示一些规则,并附上一些解释:规则“ count_asset”的方言“ mvel” ...
您需要更改样式以阻止编写规则时的书写方式,请参见this答案。