反馈人:李冠
亚马逊有品广告严重慢SQL,执行时间10秒+,并发较大,严重影响到JAVA公共库其他业务正常运行,慢SQL为:
SELECT dim.currency_code AS currency, date AS report_date, order_source_id AS source_id, order_source_sku AS msku, ad.id AS id, ad.customer_id AS customer_id, DATE_FORMAT(date, %Y) AS report_date_year, DATE_FORMAT(date, %Y%m) AS report_date_month, CONCAT(DATE_FORMAT(date, %Y), WEEK(date)) AS report_date_week, date_int AS report_date_day, 0 AS is_deleted, ad.update_time AS update_time, to_cny_exchang_erate / to_usd_exchang_erate AS usd_exchange_rmb, to_cny_exchang_erate AS exchange_rmb, ifnull(ad_sp_impressions, 0) + ifnull(ad_sd_impressions, 0) + ifnull(ad_sb_impressions, 0) AS ad_impressions, ifnull(ad_sp_clicks, 0) + ifnull(ad_sd_clicks, 0) + ifnull(ad_sb_clicks, 0) AS ad_clicks, if( ifnull(ad_sp_impressions, 0) + ifnull(ad_sd_impressions, 0) + ifnull(ad_sb_impressions, 0) > 0, (ifnull(ad_sp_clicks, 0) + ifnull(ad_sd_clicks, 0) + ifnull(ad_sb_clicks, 0)) / (ifnull(ad_sp_impressions, 0) + ifnull(ad_sd_impressions, 0) + ifnull(ad_sb_impressions, 0)), 0 ) AS ad_click_rate, ifnull(ad_sp_order_num, 0) + ifnull(ad_sd_order_num, 0) + ifnull(ad_sb_order_num, 0) AS ad_order_num, ifnull(ad_sp_sales_num, 0) + ifnull(ad_sd_sales_num, 0) AS ad_sales_num, ifnull(ad_sp_sales_amount, 0) + ifnull(ad_sd_sales_amount, 0) + ifnull(ad_sb_sales_amount, 0) AS ad_sales_amount, if( ifnull(ad_sp_clicks, 0) + ifnull(ad_sd_clicks, 0) + ifnull(ad_sb_clicks, 0) > 0, (ifnull(ad_sp_spend, 0) + ifnull(ad_sd_spend, 0) + ifnull(ad_sb_spend, 0)) / (ifnull(ad_sp_clicks, 0) + ifnull(ad_sd_clicks, 0) + ifnull(ad_sb_clicks, 0)), 0 ) AS cpc, if( ifnull(ad_sp_sales_amount, 0) + ifnull(ad_sd_sales_amount, 0) + ifnull(ad_sb_sales_amount, 0) > 0, (ifnull(ad_sp_spend, 0) + ifnull(ad_sd_spend, 0) + ifnull(ad_sb_spend, 0)) / (ifnull(ad_sp_sales_amount, 0) + ifnull(ad_sd_sales_amount, 0) + ifnull(ad_sb_sales_amount, 0)), 0 ) AS acos, ifnull(ad_sp_spend, 0) + ifnull(ad_sd_spend, 0) + ifnull(ad_sb_spend, 0) AS ad_spend, ad_sp_impressions AS ad_sp_impressions, ad_sp_clicks AS ad_sp_clicks, ad_sp_order_num AS ad_sp_order_num, ad_sp_sales_num AS ad_sp_sales_num, ad_sp_sales_amount AS ad_sp_sales_amount, ad_sp_spend AS ad_sp_spend, if(ad_sp_impressions > 0, ifnull(ad_sp_clicks, 0) / ad_sp_impressions, 0) AS ad_sp_click_rate, if(ad_sp_clicks > 0, ifnull(ad_sp_order_num, 0) / ad_sp_clicks, 0) AS ad_sp_conversion_rate, if(ad_sp_clicks > 0, ifnull(ad_sp_spend, 0) / ad_sp_clicks, 0) AS ad_sp_cpc, if(ad_sp_sales_amount > 0, ifnull(ad_sp_spend, 0) / ad_sp_sales_amount, 0) AS ad_sp_acos, ad_sd_impressions AS ad_sd_impressions, ad_sd_clicks AS ad_sd_clicks, ad_sd_order_num AS ad_sd_order_num, ad_sd_sales_num AS ad_sd_sales_num, ad_sd_sales_amount AS ad_sd_sales_amount, ad_sd_spend AS ad_sd_spend, if(ad_sd_impressions > 0, ifnull(ad_sd_clicks, 0) / ad_sd_impressions, 0) AS ad_sd_click_rate, if(ad_sd_clicks > 0, ifnull(ad_sd_order_num, 0) / ad_sd_clicks, 0) AS ad_sd_conversion_rate, if(ad_sd_clicks > 0, ifnull(ad_sd_spend, 0) / ad_sd_clicks, 0) AS ad_sd_cpc, if(ad_sd_sales_amount > 0, ifnull(ad_sd_spend, 0) / ad_sd_sales_amount, 0) AS ad_sd_acos, ad_sb_impressions AS ad_sb_impressions, ad_sb_clicks AS ad_sb_clicks, ad_sb_order_num AS ad_sb_order_num, ad_sb_sales_amount AS ad_sb_sales_amount, ad_sb_spend AS ad_sb_spend, if(ad_sb_impressions > 0, ifnull(ad_sb_clicks, 0) / ad_sb_impressions, 0) AS ad_sb_click_rate, if(ad_sb_clicks > 0, ifnull(ad_sb_order_num, 0) / ad_sb_clicks, 0) AS ad_sb_conversion_rate, if(ad_sb_clicks > 0, ifnull(ad_sb_spend, 0) / ad_sb_clicks, 0) AS ad_sb_cpc, if(ad_sb_sales_amount > 0, ifnull(ad_sb_spend, 0) / ad_sb_sales_amount, 0) AS ad_sb_acos FROM t_amz_product_performance_dim dim JOIN t_amazon_ad_infor_4 ad ON dim.source_id = ad.order_source_id AND dim.msku = ad.order_source_sku WHERE ad.update_time <= 2025-11-03 07:00:01 AND ad.update_time >= 2025-11-02 18:00:01 and ad.date < date_format(DATE_SUB(now(),INTERVAL 4 DAY ),%Y-%m-%d) AND dim.source_id in ( 14787 ) ORDER BY update_time limit 0, 200;

解决方案:1、先在表t_amz_product_performance_dim中根据source_id查出currency_code,msku(最好限制一次查不超过200,虽然当前并没超过);2、再通过source_id,msku在表t_amazon_ad_infor_{4}中根据当前条件+source_id,msku查询需要的结果;3、最后currency_code与第2步查询结果在代码中一起汇聚返回