2017-05-06 160 views
0

我想使用Groovy withBatch函数,它非常慢(15秒)。我尝试过使用不同的批量(10,400 ...),并且每批都需要很多时间。Groovy withBatch真的很慢

这是我用它编写的第二个查询,它们都很慢。

这是我的代码。有没有一个错误,或者我用错了吗?

static updateCSProducts(def conn, def webProductRows){ 
conn.withBatch(400, """ 
    UPDATE cscart_products p 
    SET usergroup_ids=:usergroup_ids, 
     b2b_group_ids=:b2b_group_ids, 
     b2b_desc_hide=:b2b_desc_hide 
    WHERE product_code = :product_code 
     OR product_id = (SELECT product_id FROM cscart_product_options_inventory WHERE product_code = :product_code) 
""") { ps -> 
    webProductRows.each({row -> 
     ProductType type = ProductType.fromCode(row.type) 
     String userGroupIds = type.getProductAvailabilityUserGroup().collect{it.getId()}.join(",") 
     String b2bGroupIds = type.getB2bUserGroup().collect{it.getId()}.join(",") 
     boolean b2bDescHide = !type.getB2bUserGroup().isEmpty() 
     println row.id + " " + userGroupIds + " " + b2bGroupIds + " " + b2bDescHide 
     ps.addBatch(product_code:row.id, usergroup_ids:userGroupIds, b2b_group_ids:b2bGroupIds, b2b_desc_hide:b2bDescHide) 
    }) 
} 

}

我使用MySQL作为数据库。当我在查看SQL连接时,在等待下一批时,我没有看到任何连接运行查询。

编辑: 我已经删除了查询,它仍然非常缓慢。 继承人的更新版本:

conn.withBatch(400, """ 
    UPDATE cscart_products p 
    SET usergroup_ids=:usergroup_ids, 
     b2b_group_ids=:b2b_group_ids, 
     b2b_desc_hide=:b2b_desc_hide 
    WHERE p.product_code = :product_code  
""") { ps -> 
    webProductRows.each({row -> 
     ProductType type = ProductType.fromCode(row.type) 
     String userGroupIds = type.getProductAvailabilityUserGroup().collect{it.getId()}.join(",") 
     String b2bGroupIds = type.getB2bUserGroup().collect{it.getId()}.join(",") 
     String b2bDescHide = !type.getB2bUserGroup().isEmpty() ? 'Y' : 'N' 
     println row.id + " " + userGroupIds + " " + b2bGroupIds + " " + b2bDescHide 
     ps.addBatch(product_code:row.id, usergroup_ids:userGroupIds, b2b_group_ids:b2bGroupIds, b2b_desc_hide:b2bDescHide) 
    }) 
} 
+0

有product_code列上的索引。 – Mike

回答

0

您正在运行吨查询对每一个更新。你最好检索一个数据列表,然后循环。这不是withBatch这是瓶颈,这是你的实施。

+0

我已经删除了这些查询,但它仍然非常慢。查看更新。 – Mike

+0

不,您仍然在每个迭代中都有查询...'ProductType.fromCode()',''type.getProductAvailabilityUserGroup()'等等,这些都是幕后运行的查询。我建议打开SQL日志记录来查看你正在运行多少个查询,你可能会感到惊讶。 –

+0

不,这些是Enum和enum中字段的访问者。它不会去数据库。 – Mike