0 0

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

"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秒,大家看看 怎么优化!
SQL 
2014年3月20日 16:47

4个答案 按时间排序 按投票排序

0 0

采纳的答案

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一列建有索引可以正常命中

以上观点如果有误,请指点!

2014年3月21日 16:10
0 0

尽量不要用IN 这种子查询,把子查询抽出来用 join的方式
你做下执行计划(explain一下)  就知道是那里需要优化了

2014年3月21日 11:12
0 0

把IN改为EXISTS,同时把LIKE改为inStr。然后看看。

2014年3月20日 22:21
0 0

你看一下执行计划,在哪里耗时比较多,然后进行对应的调整!

2014年3月20日 17:36

相关推荐

    收获不止SQL优化

    第1章 全局在胸——用工具对SQL整体优化 1 1.1 都有哪些性能工具 1 1.1.1 不同调优场景分析 2 1.1.2 不同场景对应工具 2 1.2 整体性能工具的要点 4 1.2.1 五大性能报告的获取 5 1.2.2 五大报告关注的要点 10 ...

    SQL优化经验大全

    ### SQL优化经验大全 在数据库管理和开发过程中,SQL查询优化是一项至关重要的技能。良好的SQL查询不仅可以提高系统的响应速度,还能显著降低系统资源消耗。本文将详细介绍30多条SQL优化的经验,帮助您更好地理解和...

    SQL性能优化专题分享

    从提供的文件内容来看,知识点主要围绕Oracle数据库的SQL性能优化进行展开。下面将详细说明标题和描述中提及的知识点: 1. SQL性能优化专题 - 这一部分是整个分享的主题,强调了性能优化在SQL编程中的重要性。性能...

    DB2之SQL优化浅析.pdf

    DB2中的SQL优化是一个持续的过程,涉及到多个方面的考量和技术的应用。通过对SQL语句进行细致的分析和调整,可以有效地提高数据库性能,确保系统的稳定运行。此外,定期维护和监控也是保持数据库高效运行的重要手段...

    【整理】数据库面试题索引sql优化+数据库SQL优化总结之百万级数据库优化

    首先,我们来看看"数据库面试题索引sql优化.pdf"可能涵盖的内容。 1. **SQL基础与语法**:面试通常会涉及到SQL的基本概念,如SELECT语句、JOIN操作、子查询、聚合函数(COUNT、SUM、AVG等)、WHERE和HAVING子句的...

    ORACLE SQL优化工具sqlhc

    在这个压缩包中,包含的文件`sqldx.sql`、`sqlhc.sql`和`sqlhcxec.sql`都是与SQL优化相关的脚本。 首先,我们来看`sqlhc.sql`,这是SQL Health Check的主要脚本,它会执行一系列的检查,分析数据库中的SQL语句,...

    sql 优化基础——程序员必看

    总结起来,SQL优化是一项系统工程,涉及SQL语句编写、执行计划分析、索引设计等多个方面。程序员需要深入理解这些基础知识,以便在实际工作中有效提升数据库的执行效率,降低系统的响应时间,从而提供更好的用户体验...

    数据库面试题索引sql优化

    **题目1:** 给定一张表`table1`有两个字段`FID`,`Fno`,编写一个SQL语句来列出该表中一个`FID`对应多个不同的`Fno`的记录。 **解答:** ```sql SELECT * FROM table1 WHERE FID IN ( SELECT FID FROM table1 ...

    sqlserver2000优化(必须的)

    以下是从标题“sqlserver2000优化(必须的)”和描述“sqlserver2000优化必看”中提取的关键知识点,这些知识点对于SQL Server 2000的高效运行至关重要。 ### 1. SQL Server 2000优化的重要性 SQL Server 2000作为...

    收获,不止SQL优化--抓住SQL的本质

    第1章 全局在胸——用工具对SQL整体优化 1 1.1 都有哪些性能工具 1 1.1.1 不同调优场景分析 2 1.1.2 不同场景对应工具 2 1.2 整体性能工具的要点 4 1.2.1 五大性能报表的获取 5 1.2.2 五大报表关注的要点 10 ...

    2个SQL优化语句,查询出来哪条SQL语句占据资源最多.rar

    首先,让我们看看"Script 4-6 查找CPU最高消耗的10个语句.sql"这个脚本。这个脚本的目标是列出最近执行的SQL语句中,CPU消耗最大的前10个。通常,我们会利用数据库的性能监控工具或日志来获取这些信息。例如,在...

    LECCO SQL Expert (智能自动SQL优化)

    该产品针对数据库应用的开发和维护阶段提供了几个特别的模块:SQL语法优化器、PL/SQL集成化开发调试环境(IDE)、扫描器、数据库监视器等。图1 人工智能自动SQL优化示意图 其核心模块之一“SQL语法优化器”的工作原理...

    SQL 优化原则

    系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性...

    lecco sql export pro(SQL优化器)

    在查看执行计划过程中如果有什么不明白的地方,可以点中“SQL信息按钮”,再在执行计划看不明白的地方点 击下,LECCO SQL Expert的上下文敏感帮助系统将提供执行计划该处的解释 <br> 优化模块的特点 <br> ...

    SQL数据库优化方法

    本文将深入探讨SQL数据库的优化方法,包括网络优化、硬件优化、操作系统优化、数据库参数调整以及应用程序优化等几个核心方面。 首先,我们来看网络优化。网络是数据库系统中的重要组成部分,数据的传输速度直接...

    SQL查询语句的性能优化

    SQL查询语句的性能优化与索引,写得还不错,可以看看了

    SQL优化实例:从运行30分钟到运行只要30秒

    在这个具体的案例中,我们看到一个SQL查询从原来的30分钟优化到了30秒,这是一个显著的改进。让我们详细探讨一下可能涉及的优化策略和知识点: 1. **查询结构分析**: - 首先,这个查询包含了多个表的JOIN操作,这...

    SQL性能优化

     首先,看是否用上了索引,对于该使用索引而没有用上索引的 SQL 语句,应该想办法用上索引。  其次,看是否用上正确的索引了,特别复杂的 SQL 语句,当其中 where 子句包含多个带有索引的字段时,更应该注意索引...

    EffectiveMySQL之SQL语句最优化

    EffectiveMySQL之SQL语句最优化,非常不错的SQL优化文档,非常值得初学者看。

Global site tag (gtag.js) - Google Analytics