流口水规则优化



>我目前正在尝试找到一种优化规则的方法,但不幸的是我目前没有找到任何规则,首先让我向您展示带有一些解释的规则:

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

此规则有什么作用:它查找与 RuleConfig 提供的所有条件匹配的资产数量的所有$customerId。

数据示例:

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,例如这个,那么我运行流口水(作为带有 fireAllRules(( 的 java 独立应用程序(,需要 199 毫秒才能给我符合条件的完整客户列表。 但是我插入的规则配置越多,花费的时间就越多......

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

仅 2 个规则配置超过 13 分钟。我的数据库包含大约 1200 个 CustomerRefSubscription、28,000 个资产和 36,000 个 VAssetWithOwner。

如何改进此规则?我的数据库中可能有一百多个规则配置,这样做,需要几个小时才能返回一些结果......

我已经发现删除这部分"并且存在 VAssetWithOwner( id == $tableId,$targetUsage包含所有者("使用 129 000 个规则配置转到 900ms 到 13ms,这是一个相当大的改进,但我真的需要这个过滤器......我不能只是删除它...

谢谢 纪尧姆

你需要改变你的写作风格,当你的规则被阻止时,看看这个答案。

相关内容

  • 没有找到相关文章

最新更新