SELECT d.areaCode, d.areaName, d.bciStreetName, d.wasteTypeCode, d.wasteTypeName, d.wasteTrashCode, d.wasteTrashName, d.wasteName, sum( p.produceNumTotal ) AS produceNumTotal, sum( IFNULL(t.disposalNumTotal, 0 ),decimal(10,2) ) AS disposalNumTotal, sum( p.cityTransferNum ) AS cityTransferNum, sum( p.transferCityOutNum ) AS transferCityOutNum, sum( p.transferProvinceOutNum ) AS transferProvinceOutNum, sum( IFNULL( p.transferCityOutNum, 0 ) + IFNULL( p.transferProvinceOutNum, 0 ) ) AS transferCityAndProInNum, sum( t.transferCityInNum ) AS transferCityInNum, sum( t.transferProvinceInNum ) AS transferProvinceInNum, sum( IFNULL( t.transferCityInNum, 0 ) + IFNULL( t.transferProvinceInNum, 0 ) ) AS transferCityAndProInNum, sum( d.disposalAmount ) AS disposalAmount, sum( d.zhlyAmount ) AS zhlyAmount, sum( d.czAmount ) AS czAmount, sum( d.zcAmount ) AS zcAmount, sum( d.tmAmount ) AS tmAmount, sum( d.fsAmount ) AS fsAmount, sum( d.qtAmount ) AS qtAmount, CONVERT ( sum( zhlyAmount ) / sum( d.disposalAmount ) * 100, DECIMAL ( 10, 2 ) ) AS zhlyProportion, CONVERT ( sum( tmAmount ) / sum( d.disposalAmount ) * 100, DECIMAL ( 10, 2 ) ) AS tmProportion, CONVERT ( sum( fsAmount ) / sum( d.disposalAmount ) * 100, DECIMAL ( 10, 2 ) ) AS fsProportion, CONVERT ( sum( qtAmount ) / sum( d.disposalAmount ) * 100, DECIMAL ( 10, 2 ) ) AS qtProportion FROM wfcs_disposal_account_day_report d LEFT OUTER JOIN wfcs_transfer_sheet_disposal_day_summary t ON d.cityCode = t.disposalCityCode AND t.tenantId = d.tenantId LEFT OUTER JOIN wfcs_transfer_sheet_produce_day_summary p ON d.cityCode = p.produceCityCode AND d.tenantId = p.tenantId WHERE d.solidWasteType ='ybgygf' AND d.tenantId = '779ca469251e4a639fd39a7ab57e6859' AND d.recordDate >= '2023-06-01 00:00:00.0' AND d.recordDate <= '2023-06-04 00:00:00.0' AND d.cityCode = 'dacef933e39740349e6fb89fac792aae' GROUP BY areaCode ORDER BY produceNumTotal DESC 怎么优化这个sql
时间: 2024-03-07 21:52:06 浏览: 53
这个SQL语句可以进行以下优化:
1. 在wfcs_disposal_account_day_report表中添加索引,包括solidWasteType、tenantId、recordDate和cityCode列,以加快查询速度。
2. 可以考虑使用INNER JOIN代替LEFT OUTER JOIN,因为INNER JOIN在连接两个表的时候比LEFT OUTER JOIN更快。
3. 避免在SELECT语句中使用函数,因为函数会使查询变慢。可以将计算逻辑移至应用程序代码中进行计算。
4. 考虑对查询结果进行缓存,以避免重复查询相同的数据。
5. 可以尝试将GROUP BY子句中的areaCode列替换为更简单的列,以避免在GROUP BY子句中使用太多列。
6. 如果数据量非常大,可以考虑分区表以提高查询性能。
总之,优化SQL查询的方法有很多,需要根据具体情况进行分析和优化。
相关问题
<select id="getCityNameByCodeList" resultType="com.ourhz.product.appdata.vo.AreaVO"> <if test="provinceUnit !=null"> SELECT 520000 AS areaCode, '省直单位' AS areaName, 1 AS areaType UNION </if> SELECT a.codeNum AS areaCode, a.areaName AS areaName, 1 AS areaType FROM statistics_data.mh_area_table AS a WHERE a.parentNum != 0 AND a.codeNum IN <foreach collection="codeList" item="item" index="index" separator="," open="(" close=")"> #{item} </foreach> </select> 解析这段代码
这段代码是一个 MyBatis Mapper XML 文件中的一个 Select SQL 语句,用于查询指定区域编码列表中的城市名称和类型。具体解析如下:
1. `<select>` 标签表示这是一个查询语句。
2. `id` 属性指定了这个查询语句的唯一标识符。
3. `resultType` 属性指定了查询结果的 Java 对象类型。
4. `<if>` 标签用于条件判断,它的 `test` 属性指定了条件表达式。
5. `SELECT` 关键字后面的字段列表是要查询的列,其中 `AS` 关键字用于给查询结果中的列取别名。
6. `UNION` 关键字用于合并两个查询结果集。
7. `<foreach>` 标签用于遍历指定的集合,它的 `collection` 属性指定了要遍历的集合,`item` 属性指定了集合中的元素变量名,`index` 属性指定了元素的下标变量名,`separator` 属性指定了元素之间的分隔符,`open` 和 `close` 属性指定了整个遍历块的前缀和后缀。
8. `#{item}` 是 MyBatis 中的占位符语法,会被遍历中的元素值替换。
总的来说,这段代码的作用是根据传入的区域编码列表,查询这些区域编码对应的城市名称和类型。其中,如果查询的是省直单位,则会额外返回一个固定的区域编码和区域名称。
SELECT sum(x.offline = 1) AS deviceoffline , sum(x.offline = 0) AS deviceonline FROM ( SELECT id AS devicecount , TIMESTAMPDIFF(HOUR, `update`, NOW()) > 3 AS offline , uuid FROM `laim_data`.`usedevice` ) x WHERE x.uuid IN ( SELECT uuid FROM `laim_data`.`usedevice` d WHERE d.city IN ( SELECT areacode FROM `laim_data`.`user_area` WHERE user_code = 'test' ) );进行优化
这个SELECT语句可以进行如下优化:
1. 将子查询中的uuid列表提前查询出来,然后在主查询中使用IN语句代替子查询,可以避免重复查询。
2. 将TIMESTAMPDIFF函数中的NOW()提前查询出来,可以避免在每个记录中都重复计算当前时间。
优化后的SQL语句如下:
```
SELECT
SUM(x.offline = 1) AS deviceoffline,
SUM(x.offline = 0) AS deviceonline
FROM (
SELECT
id AS devicecount,
(TIMESTAMPDIFF(HOUR, `update`, now()) > 3) AS offline,
uuid
FROM `laim_data`.`usedevice`
WHERE uuid IN (
SELECT uuid
FROM `laim_data`.`usedevice` d
WHERE d.city IN (
SELECT areacode
FROM `laim_data`.`user_area`
WHERE user_code = 'test'
)
)
) x;
```
这样就可以减少重复查询,提高查询效率。
阅读全文