根据给定的SQL语句,可以进行以下优化:

  1. 使用表别名:使用表别名可以提高可读性和简化SQL语句。
  2. 使用内连接代替左连接:由于左连接可能会导致性能问题,可以考虑使用内连接(INNER JOIN)来替代。
  3. 使用CASE语句代替IF函数:在计算完成和未完成项目数量时,可以使用CASE语句来替代IF函数。
  4. 优化子查询:可以将子查询中的条件进行合并以提高效率。
  5. 索引优化:根据实际情况,可以考虑对C_TOWID、R_STATEMENT_ID、C_DELETED、C_ANNUAL和C_PERIOD列添加索引,以提高查询效率。

优化后的SQL语句如下所示:

SELECT x.C_VILID, x.C_VILNAME, SUM(x.m9) AS m9_x, SUM(x.m1) AS m1_x, SUM(x.m2) AS m2_x, SUM(x.m3) AS m3_x, SUM(x.m4) AS m4_x, SUM(x.m5) AS m5_x, SUM(x.m6) AS m6_x, SUM(x.m7) AS m7_x, SUM(x.m8) AS m8_x, SUM(CASE WHEN x.C_PROJECTSTATUS = 1 THEN 1 ELSE 0 END) AS finish, SUM(CASE WHEN x.C_PROJECTSTATUS = 0 THEN 1 ELSE 0 END) AS nofinish, y.C_PLACEID, SUM(y.m9) AS m9_y, SUM(y.m1) AS m1_y, SUM(y.m2) AS m2_y, SUM(y.m3) AS m3_y, SUM(y.m4) AS m4_y, SUM(y.m5) AS m5_y, SUM(y.m6) AS m6_y, SUM(y.m7) AS m7_y, SUM(y.m8) AS m8_y FROM (SELECT x.C_VILID, x.C_VILNAME, x.C_PROJECTSTATUS, x.m9, x.m1, x.m2, x.m3, x.m4, x.m5, x.m6, x.m7, x.m8 FROM db_twenty.t_projectreports x WHERE x.C_TOWID = 441424137000 AND x.R_STATEMENT_ID = 47 AND x.C_DELETED = 0) x LEFT JOIN (SELECT x.C_VILID AS C_PLACEID, x.m9, x.m1, x.m2, x.m3, x.m4, x.m5, x.m6, x.m7, x.m8 FROM db_twenty.t_projectreports x WHERE x.C_TOWID = 441424137000 AND x.C_ANNUAL * 100 + x.C_PERIOD <= 202305 AND x.C_DELETED = 0) y ON x.C_VILID = y.C_PLACEID GROUP BY x.C_VILID, x.C_VILNAME, y.C_PLACEID

同时,确保相关的列上已经创建了索引以提高查询性能

SELECT FROM SELECT xC_VILID xC_VILNAME sumxm9 as m9_x sumxm1 as m1_x sumxm2 as m2_x sumxm3 as m3_x sumxm4 as m4_x sumxm5 as m5_x sumxm6 as m6_x sumxm7 as m7_x sumxm8 as m8_x s

原文地址: http://www.cveoy.top/t/topic/ikL6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录