2017-05-06 37 views
0

Groovy withBatch関数を使用しようとしていますが、実際は遅いです(15秒)。私はさまざまなバッチサイズ(10,400 ...)を試してきました。そして、各バッチを実行するのに多くの時間がかかります。Groovy withBatchは本当に遅いです

これは2番目のクエリです。私はそれを使って書きますが、どちらも遅いです。

ここに私のコードです。それにバグがありますか、それとも間違って使用していますか?

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接続を見ているとき、私は次のバッチを待っている間、実際にクエリを実行している接続が表示されません。

編集: クエリを削除しましたが、それでもまだ非常に遅いです。 HERESに更新されたバージョン:

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

いいえ、あなたはまだ1回の繰り返しごとにクエリを持っています... 'ProductType.fromCode()'、 'type.getProductAvailabilityUserGroup()'などこれらはすべてシーンの裏でクエリを実行しています。私は実行しているクエリの数を確認するためにSQLログを有効にすることをお勧めします。 –

+0

いいえ、それらはEnumであり、列挙型のフィールドのアクセサーです。それはデータベースには行きません。 – Mike

関連する問題