优化SQL select round( ohbmc.after_actual_amount/zz,0) cost_moneyi ,count(distinct case when ddp.orig_plan_rid = -1 then null else ddp.orig_plan_rid end) AS orig_num ,array_agg (dlt.state) AS loading_state ,count(DISTINCT CASE WHEN ddp.sale_planid = -1 THEN NULL ELSE ddp.sale_planid END) AS saleid_num--销地已计划数量 ,array_agg(dto.state) AS saletransport_state from ( SELECT id AS origin_planid , unnest(cabinet_rule_id) cabinet_rule_id -- 判断 next_plan_id 本身是空和 next_plan_id 为 {} ,unnest(case when (next_plan_id is null or next_plan_id[1] is null) then ARRAY[-1]::integer[] else next_plan_id end) as sale_planid --销地计划 , case when dp.plan_receiver_id is null then -1 else dp.plan_receiver_id end orig_plan_rid --产地计划 FROM ods.ods_durian_delivery_plan as dp left join ods.ods_hl_commodity_category as hcc on hcc.category_id = dp.category_id WHERE dp.type = 'ORIGIN' AND dp.deleted = 99 AND dp.tenant_id = 1 and cabinet_rule_id='{8}'or cabinet_rule_id='{9}'or cabinet_rule_id='{10000005}'---取白心火龙果 AND hcc.category_name = '火龙果') as ddp LEFT JOIN ods.ods_durian_loading_task AS dlt ON dlt.plan_id = ddp.origin_planid and dlt.plan_type='ORIGIN' AND dlt.deleted = 99 LEFT JOIN ods.ods_durian_transport_order AS dto ON dto.plan_id = ddp.sale_planid AND dto.deleted = 99 LEFT JOIN ods.ods_durian_receipt_task AS drt ON drt.plan_id = ddp.sale_planid AND drt.deleted = 99 LEFT JOIN ods.ods_durian_transport_order AS dto1 ON dto1.plan_id = ddp.sale_planid AND dto1.sort_no = 1 AND dto1.deleted = 99 left join (select odlsi.plan_id,sum(odlsi.quantity) zz from ods.ods_durian_loading_sku_item odlsi group by 1) odlsi on odlsi.plan_id=dlt.plan_id left join (select *, unnest(case when ( odbr.bill_main_id is null or odbr.bill_main_id is null) then ARRAY[-1]::integer[] else odbr.bill_main_id end) bill_main_id_r from ods.ods_durian_bill_rel odbr) odbr on odbr.data_id= dlt.plan_id and odbr.data_type='ORIGIN_FEE' left join ods.ods_hl_bill_main_currency ohbmc on ohbmc.bill_main_id=odbr.bill_main_id_r and ohbmc.deleted=99 group by 1;
时间: 2024-03-28 21:37:58 浏览: 612
这个SQL查询语句比较复杂,可以考虑以下几种优化方式:
1. 使用JOIN语句代替子查询:可以把子查询转换成JOIN语句,这样可以提高查询的效率。
2. 合理使用索引:根据实际情况,选择合适的索引可以大大提升查询效率。可以对WHERE子句中的条件表达式所涉及的列添加索引。
3. 减少DISTINCT关键字的使用:DISTINCT关键字会增加查询的开销,如果不必要,可以考虑去掉。
4. 减少聚合函数的使用:聚合函数是一种开销较大的操作,如果可以不用聚合函数,可以考虑去掉。
5. 优化WHERE子句中的条件表达式:可以优化WHERE子句中的条件表达式,尽量使用简单的条件表达式,减少复杂的逻辑判断。
相关问题
优化这段代码 SELECT dp.id AS orig_num ,round( ohbmc.after_actual_amount/zz,2) cost_money ,array_agg ("dlt"."state") AS "loading_state" ,array_agg(DISTINCT "didt"."arrival_time") AS "arrival_time"--到港日期 ,count(DI
很抱歉,由于您没有提供完整的 SQL 语句,我无法给出完整的优化建议。但是,我可以给您一些优化 SQL 语句的一般建议:
1. 使用索引:为查询中经常使用的列创建索引,可以加速查询速度。
2. 避免使用通配符:在查询中尽量避免使用通配符,如“%”,因为这会导致全表扫描。
3. 减少 JOIN 操作:尽量避免多个表的 JOIN 操作,可以考虑使用子查询或者视图来替代。
4. 使用 EXISTS 替代 IN:在查询中,使用 EXISTS 替代 IN 可以提高查询性能。
5. 尽量减少子查询:在查询中尽量避免使用子查询,因为子查询的执行效率较低。
6. 避免使用 ORDER BY:如果不需要对结果进行排序,可以避免使用 ORDER BY,因为它会增加查询的时间。
7. 分批处理:如果查询的数据量较大,可以考虑将数据分批处理,以减少查询的时间。
希望这些建议对您有所帮助!
SELECT rz.DEPT_CODE, rz.VOLT_LEVEL, rz.AR_YEAR, rz.AR_MONTH, ROUND( SUM( CURRENT_ACTUAL_RECORD_AMOUNT )/ 10000, 4 ) "和" FROM prj_ah_erp_rz_item rz LEFT JOIN mag_cd_coding c ON rz.VOLT_LEVEL = c.CODE_NAME GROUP BY rz.DEPT_CODE, rz.VOLT_LEVEL
这是一个SQL查询语句,它的作用是从表prj_ah_erp_rz_item和mag_cd_coding中获取数据,并按照rz.DEPT_CODE和rz.VOLT_LEVEL字段进行分组,然后对每个分组中的CURRENT_ACTUAL_RECORD_AMOUNT字段求和,并将结果除以10000并保留四位小数。
具体解释如下:
- SELECT rz.DEPT_CODE, rz.VOLT_LEVEL, rz.AR_YEAR, rz.AR_MONTH, ROUND(SUM(CURRENT_ACTUAL_RECORD_AMOUNT)/10000, 4) "和": 选择需要查询的字段,并使用ROUND函数将求和结果除以10000并保留四位小数。
- FROM prj_ah_erp_rz_item rz LEFT JOIN mag_cd_coding c ON rz.VOLT_LEVEL = c.CODE_NAME: 指定查询的表,并使用LEFT JOIN连接表prj_ah_erp_rz_item和mag_cd_coding,条件为rz.VOLT_LEVEL = c.CODE_NAME。
- GROUP BY rz.DEPT_CODE, rz.VOLT_LEVEL: 指定按照rz.DEPT_CODE和rz.VOLT_LEVEL字段进行分组。
最终查询结果将包含rz.DEPT_CODE、rz.VOLT_LEVEL、rz.AR_YEAR、rz.AR_MONTH和求和结果。
阅读全文