You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Billing Center跨月付款查询性能问题:SQL快但结果遍历耗时久

Guidewire Billing Center 批量数据转换性能优化方案

问题背景

在Billing Center中导出跨月付款数据时,SQL查询本身仅需2秒,但遍历结果并转换为PaymentDetailDTO的过程耗时高达90秒。查询目标为DirectBillMoneyRcvd实体,处理每条记录时需访问BaseDistItems、InvoiceItem、PolicyPeriod、Account等关联实体,已按Guidewire技术支持建议提前关联实体,但性能未改善,相关代码如下:

var dbmrQueryUptoBDI = Query.make(DirectBillMoneyRcvd)
    .between(DirectBillMoneyRcvd#ReceivedDate, startDate, endDate)
    .compareIn(DirectBillMoneyRcvd#PaymentRequestType_UFG, paymentTypeList.toTypedArray())
    .join(DirectBillMoneyRcvd#BaseDist)
    .join(entity.BaseDistItem, "ActiveDist")

var dbmrWithII = dbmrQueryUptoBDI.join(entity.BaseDistItem#InvoiceItem)
var dbmrIIToPP = dbmrWithII.join(InvoiceItem#PolicyPeriod)

// 从PolicyPeriod关联到PolicyCommission(通过PP.ID关联PrimaryPolicyPeriod)
dbmrIIToPP.join("ID", PolicyCommission, "PrimaryPolicyPeriod")
    // 从PolicyCommission关联到ProducerCode(通过ProducerCodeID关联ID)
    .join("ProducerCode", ProducerCode, "ID")
        // 从ProducerCode关联到Producer(通过ProducerID关联ID)
    .join("Producer", Producer, "ID")
    .compare(Producer#AgentNumber_UFG, Relop.Equals, agentNumber)

dbmrIIToPP.join(PolicyPeriod#Policy)
    .join(Policy#Account)
    .join("ID", AccountContact, "InsuredAccount")
    .join(AccountContact#Contact)

dbmrWithII
    .join(InvoiceItem#Charge)
    .join(Charge#ChargePattern)

var results = dbmrQueryUptoBDI.select()

var paymentDetailList = new ArrayList<PaymentDetailDTO>()

foreach (dbmr in results) {
     // 数据转换逻辑
  paymentDetail = _paymentDetailPlugin.toDTOWithBaseDistItems(dbPayment, dbPayment?.BaseDist?.DistItems)
  paymentDetailList.add(paymentDetail)
}

优化建议

  • 启用批量预加载(Fetch Plan)
    Guidewire的Query API默认懒加载关联实体,即便提前join也可能未真正批量加载数据。显式定义Fetch Plan,一次性加载所有需要的关联实体,避免遍历触发N+1次数据库查询:

    var fetchPlan = FetchPlan.make()
        .add(DirectBillMoneyRcvd#BaseDist)
        .add(BaseDist#DistItems)
        .add(BaseDistItem#InvoiceItem)
        .add(InvoiceItem#PolicyPeriod)
        .add(PolicyPeriod#Policy)
        .add(Policy#Account)
        .add(Account#AccountContacts)
        .add(AccountContact#Contact)
        .add(InvoiceItem#Charge)
        .add(Charge#ChargePattern)
        .add(PolicyPeriod#PolicyCommissions)
        .add(PolicyCommission#ProducerCode)
        .add(ProducerCode#Producer)
    
    var results = dbmrQueryUptoBDI.select(fetchPlan)
    
  • 优化DTO转换逻辑
    检查_paymentDetailPlugin.toDTOWithBaseDistItems方法内部是否存在额外数据库查询或冗余计算,将重复逻辑提取到循环外;考虑批量转换方式,传入整个结果集给插件处理,减少方法调用开销。

  • 确认查询关联有效性
    当前代码存在多分支join(dbmrIIToPP和dbmrWithII),需确认所有关联条件都合并到主查询dbmrQueryUptoBDI中,避免部分关联未生效导致懒加载。

  • 缩小结果集范围
    通过分页分批处理数据,避免一次性加载大量数据到内存;检查查询条件,增加合理筛选规则减少返回记录数。

  • 数据库索引优化
    验证Producer#AgentNumber_UFG、DirectBillMoneyRcvd#ReceivedDate等过滤字段的索引是否齐全,确保关联查询的数据库层面性能最优。

内容的提问来源于stack exchange,提问作者Brandon Hunt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:07:07