大家看看这个SQL该如何优化

问题描述

"SELECT sum(VALUE) value ,"+" CONVERT(varchar(2),DATE_TIME,108) DAY FROM"+" ed_electricity_energy_hour WHERE item_name IN ("+" SELECT"+" ems_unit.code + '_' + ems_collector.code + '_' + ems_item.code"+" FROM"+" ems_item" +" JOIN ems_collector ON ems_collector.id = ems_item.collector"+" JOIN ems_unit ON ems_unit.id = ems_collector.unit"+" WHERE"+" ems_item.item_type = 14"+" AND ems_item.sort_area > 0"+" AND ems_unit.code = '110101A003' )"+" AND date_time LIKE '2013-02-27%' GROUP BY"+" CONVERT(varchar(2),DATE_TIME,108)"+" ORDER BY CONVERT(varchar(2),DATE_TIME,108)";说明:在日期表里查value总和,时间(取小时),而item_name是由ems_unit.code_ems_collector.code_ems_item.code组成的字符串,查询条件为时间2013-02-27%,和ems_unit.code = '110101A003',就是item_name里包含110101A003这个ems_unit.code,表ed_electricity_energy_hour的数据量大约1000条,查询时间大概20秒,大家看看 怎么优化!

解决方案

SELECT SUM(VALUE) VALUE, CONVERT(VARCHAR(2), DATE_TIME, 108) DAY FROM ED_ELECTRICITY_ENERGY_HOUR WHERE ITEM_NAME IN (SELECT EMS_UNIT.CODE || '_' || EMS_COLLECTOR.CODE || '_' || EMS_ITEM.CODE FROM EMS_ITEM JOIN EMS_COLLECTOR ON EMS_COLLECTOR.ID = EMS_ITEM.COLLECTOR JOIN EMS_UNIT ON EMS_UNIT.ID = EMS_COLLECTOR.UNIT WHERE EMS_ITEM.ITEM_TYPE = 14 AND EMS_ITEM.SORT_AREA > 0 AND EMS_UNIT.CODE = '110101A003') AND DATE_TIME LIKE '2013-02-27%' GROUP BY CONVERT(VARCHAR(2), DATE_TIME, 108) ORDER BY CONVERT(VARCHAR(2), DATE_TIME, 108); 需求分析: 1. 对ED_ELECTRICITY_ENERGY_HOUR表中Value列求和 2. 获取对ED_ELECTRICITY_ENERGY_HOUR表中Value列求和DATE_TIME的日期中的日,并根据该列分组和升序排序 3. 数据范围: a. EMS_UNIT.CODE,EMS_COLLECTOR.CODE,EMS_ITEM.CODE三列与ED_ELECTRICITY_ENERGY_HOUR.ITEM_NAME相等 b. 指定EMS_UNIT.CODE(110101A003) c. 指定EMS_ITEM.ITEM_TYPE(14) d. EMS_ITEM.SORT_AREA必须大于0 e. ED_ELECTRICITY_ENERGY_HOUR.DATE_TIME为指定日期(2013-02-27)解决方案:1. ED_ELECTRICITY_ENERGY_HOUR.ITEM_NAME采用IN还是EXISTS a. 当EMS_ITEM、EMS_COLLECTOR、EMS_UNIT三表关联结果集数据量很小(百行以内),优化提升性能空间不大 b. 当以上三表关联结果很大,上千过万,可以考虑直接与ED_ELECTRICITY_ENERGY_HOUR表四表关联,表顺序根据数据量由大到小 c. 由于ED_ELECTRICITY_ENERGY_HOUR.ITEM_NAME一列需要与不同表的多个列匹配,采用EXISTS的结果:四表关联>EXISTS>IN,个人建议还是表关联最好 d. 避免使用SubStr截取函数,这影响索引的使用2. 对ED_ELECTRICITY_ENERGY_HOUR.DATE_TIME的限制建议改为BETWEEN.AND,LIKE不会走索引,不解释3. 可以考虑将DAY一列做以下修改: CONVERT(VARCHAR(2), DATE_TIME, 108) => SUBSTR('2013-02-27',9,10) 这样做可以避免在DATE_TIME一列使用函数,提高性能,若DATE_TIME一列建有索引可以正常命中以上观点如果有误,请指点!
解决方案二:
尽量不要用IN 这种子查询,把子查询抽出来用 join的方式你做下执行计划(explain一下) 就知道是那里需要优化了
解决方案三:
把IN改为EXISTS,同时把LIKE改为inStr。然后看看。
解决方案四:
你看一下执行计划,在哪里耗时比较多,然后进行对应的调整!

时间: 2024-10-31 15:41:59

大家看看这个SQL该如何优化的相关文章

改进数据库SQL语句进行优化的理由

数据|数据库|优化|语句 应用程序的优化通常可分为两个方面:源代码的优化和SQL语句的优化.源代码的优化在时间成本和风险上代价很高:另一方面,源代码的优化对数据库系统性能的提升收效有限. 优化的理由 1)SQL语句是对数据库(数据)进行操作的惟一途径: 2)SQL语句消耗了70%~90%的数据库资源: 3)SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低: 4)SQL语句可以有不同的写法: 5)SQL语句易学,难精通. 优化技术的发展 第一

Oracle SQL tuning 数据库优化步骤图文教程

  SQL Turning 是Quest公司出品的Quest Central软件中的一个工具.Quest Central是一款集成化.图形化.跨平台的数据库管理解决方案,可以同时管理 Oracle.DB2 和 SQL server 数据库. 一.SQL Tuning for SQL Server简介 SQL语句的优化对发挥数据库的最佳性能非常关键.然而不幸的是,应用优化通常由于时间和资源的因素而被忽略.SQL Tuning (SQL优化)模块可以对比和评测特定应用中SQL语句的运行性能,提出智能

百万负载之SQL数据库的优化

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 在考虑一个网站如果承载日百万甚至千万pv时,我们往往本能的往两个方向考虑:静态化及分布式. 固然,对于新浪等门户类型的网站来说,静态化+读写分离及分布式,可以解决大多数的问题.可是我们面临的更多的,可能是大数据+高并发+实时读取,而静态化的固定性便很难解决这个问题. 比如矮个芝麻最近接到的一个电子商务类的网站,流量大,数据量大,同时要求820

select-这条sql还可以优化吗,求帮助

问题描述 这条sql还可以优化吗,求帮助 SELECT * FROM user r WHERE r.userDeviceId='userDeviceId' ORDER BY r.create_time ASC 每次执行这条占用很多资源 解决方案 SELECT * FROM user r WHERE r.userDeviceId='userDeviceId' ORDER BY r.create_time ASC 每次执行这条占用很多资源 需要在userDeviceID这个字段上加个索引,可以节省资

sql server-求助:sqlserver一条sql语句的优化 是否需要索引 建立什么样的索引合适

问题描述 求助:sqlserver一条sql语句的优化 是否需要索引 建立什么样的索引合适 1C select COUNT(*) total from (select distinct(device_token) from MDM_POLICY_UPDATE where len(device_token)=64 and SW='crmi_poly') a 解决方案 我觉得直接可以用count(device_token) 然后直接groupby device个人感觉最拖后腿的应该是len()这个函

SQL SERVER的优化建议与方法_MsSql

在实际的工作中,尤其是在生产环境里边,SQL语句的优化问题十分的重要,它对数据库的性能的提升也起着显著的作用.我们总是在抱怨机器的性能问题,总是在抱怨并发访问所带来的琐问题,但是如果我们对没一条SQL语句进行优化,尽管不能说可以解决全部问题,但是至少可以解决大部分问题. 1.Top排序问题. 我们经常要对表某个字段进行排序,然后取前N名.所以我们会写如下的SQL语句: select top 100 * from 表 order by Score desc 如果表非常大的话,那么这样的操作是非常消

Sql Server 性能优化之包含列

原文:Sql Server 性能优化之包含列 Sql Server 性能优化之包含列        导读:数据数优化查询一直是个比较热门的话题,小生在这方面也只能算是个入门生.今 天我们就讲下数据库包含列这个一项的作用及带来的优化效果           引用下MSDN里面的一段解释:        当查询中的所有列都作为键列或非键列包含在索引中时,带有包含性非键列的索引可以显 著提高查询性能. 这样可以实现性能提升,因为查询优化器可以在索引中找到所有列值:不 访问表或聚集索引数据,从而减少磁盘

注释-oracle sql查询语句优化

问题描述 oracle sql查询语句优化 各位大神,我想问下在生产PLSQL,将****内的注释以后,可以查询出结果(用时:16S秒),否则,SQL就一直处于执行状态,查询不出结果.在线等,求各位大神们解惑 select cs.P_VOICEDIAL_FLAG PVoicedialFlag cs.pri_card_nbr priCardNbr cs.total_bal totalBal cs.overdue_amount totalOdue cs.risk_score riskScore ci

select-oracle sql查询语句优化

问题描述 oracle sql查询语句优化 select moni.p_code,moni.department,moni.monitorserialno,moni.adminname,moni.buildingname from t_monitorroom moni where moni.p_code in (select roleauth.monitorroomid from t_monitorroom_role_authority roleauth left join t_monitorr

sql-求下面这段SQL语句的优化

问题描述 求下面这段SQL语句的优化 update #temp set res = ( select top 1 [Desc] from Response nolock where req_no = ( select top 1 req_no from Request nolock where id = #temp.id order by update_date desc ) order by update_date desc ), [pro_status] = ( select top 1 [