0 0

【oracle】SQL语句优化问题0

大家帮我看下以下这个sql语句 能不能优化下  数据量大的时候 查询速度太慢了 几乎卡住


select distinct zch.fluxtime, zch.inavgvec, zch.outavgvec, zch.bandwidth
  from zw_circuitflux_hour zch
  join zw_devicechname zd on zch.remark = zd.deremark
  join zw_circuit_performance zcp on zd.devicename = zcp.equipname
where zcp.equipname =
       (select distinct (zcp.equipname)
          from zw_circuit_performance zcp
          left join zw_devicechname zd on zcp.equipname = zd.devicename
         where zd.devicechname = '省级厂巷核心路由器')
   and zch.fluxtime = trunc(zch.fluxtime, 'dd')
   and zch.fluxtime >= to_date('2011-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
   and zch.fluxtime <= to_date('2012-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
order by zch.fluxtime asc

谢谢了!!!
2012年10月25日 12:31

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

0 0

1、尽量不用子查询
2、根据表的数据量,将小表放在后面
3、distinct最后不要放到子查询下面
4、where条件中将比较精确的放在最后比较
5、可能的关联字段索引是否有效
6、最后将大表分区吧

2012年10月28日 10:27
0 0

其实sql的优化,通过查看查询计划然后根据具体的业务可以把查询慢的sql拆分出来,然后可以在程序中对数据处理,分组,排序,拼接。

2012年10月28日 08:11
0 0

select distinct zch.fluxtime, zch.inavgvec, zch.outavgvec, zch.bandwidth
  from zw_circuitflux_hour zch
  join zw_devicechname zd on zch.remark = zd.deremark
  join zw_circuit_performance zcp on zd.devicename = zcp.equipname
where zcp.equipname =
       (select distinct (zcp.equipname)
          from zw_circuit_performance zcp
          left join zw_devicechname zd on zcp.equipname = zd.devicename
         where zd.devicechname = '省级厂巷核心路由器')
   and zch.fluxtime = trunc(zch.fluxtime, 'dd')
   and zch.fluxtime >= to_date('2011-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
   and zch.fluxtime <= to_date('2012-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
order by zch.fluxtime asc


1、如下子查询有点罗嗦  直接在外查询中搞定
  zcp.equipname =
       (select distinct (zcp.equipname)
          from zw_circuit_performance zcp
          left join zw_devicechname zd on zcp.equipname = zd.devicename
         where zd.devicechname = '省级厂巷核心路由器')

====》》》
select distinct zch.fluxtime, zch.inavgvec, zch.outavgvec, zch.bandwidth
  from zw_circuitflux_hour zch
  join zw_devicechname zd on zch.remark = zd.deremark
  join zw_circuit_performance zcp on zd.devicename = zcp.equipname
   and zd.devicechname = '省级厂巷核心路由器'
   and zch.fluxtime = trunc(zch.fluxtime, 'dd')
   and zch.fluxtime >= to_date('2011-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
   and zch.fluxtime <= to_date('2012-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
order by zch.fluxtime asc

2、zch.fluxtime = trunc(zch.fluxtime, 'dd')  干嘛的 感觉没用 因为
   and zch.fluxtime >= to_date('2011-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
   and zch.fluxtime <= to_date('2012-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
============》》
select distinct zch.fluxtime, zch.inavgvec, zch.outavgvec, zch.bandwidth
  from zw_circuitflux_hour zch
  join zw_devicechname zd on zch.remark = zd.deremark
  join zw_circuit_performance zcp on zd.devicename = zcp.equipname
  where
   zch.fluxtime >= to_date('2011-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
   and zch.fluxtime <= to_date('2012-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
   and zd.devicechname = '省级厂巷核心路由器'
order by zch.fluxtime asc

3、distinct 没必要要 排重的话可以考虑分组/在应用里做
select zch.fluxtime, zch.inavgvec, zch.outavgvec, zch.bandwidth
  from zw_circuitflux_hour zch
  join zw_devicechname zd on zch.remark = zd.deremark
  join zw_circuit_performance zcp on zd.devicename = zcp.equipname
  where
   zch.fluxtime >= to_date('2011-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
   and zch.fluxtime <= to_date('2012-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
   and zd.devicechname = '省级厂巷核心路由器'
order by zch.fluxtime asc

4、因为zd.devicename = zcp.equipname 和 zd.devicechname = '省级厂巷核心路由器'
此处不知道join  是inner还是left? 如果是inner可以改成
select distinct zch.fluxtime, zch.inavgvec, zch.outavgvec, zch.bandwidth
  from zw_circuitflux_hour zch
  join zw_devicechname zd on zch.remark = zd.deremark
  where
   zch.fluxtime >= to_date('2011-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
   and zch.fluxtime <= to_date('2012-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
   and zd.devicechname = '省级厂巷核心路由器'
order by zch.fluxtime asc

此时只有两个表的连接

最后重点:
fluxtime  一定建索引  devicechname 尽量也建

2012年10月25日 23:04
0 0

select distinct zch.fluxtime, zch.inavgvec, zch.outavgvec, zch.bandwidth
  from zw_circuitflux_hour zch
  join zw_devicechname zd
    on zch.remark = zd.deremark
  join zw_circuit_performance zcp
    on zd.devicename = zcp.equipname
 where zd.devicechname = '省级厂巷核心路由器'
   and zch.fluxtime = trunc(zch.fluxtime, 'dd')
   and zch.fluxtime >= to_date('2011-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
   and zch.fluxtime <= to_date('2012-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
 order by zch.fluxtime asc

2012年10月25日 14:13
0 0

SELECT DISTINCT zch.fluxtime
	,zch.inavgvec
	,zch.outavgvec
	,zch.bandwidth
FROM zw_circuitflux_hour zch
INNER JOIN zw_devicechname zd ON zch.remark = zd.deremark
INNER JOIN zw_circuit_performance zcp ON zd.devicename = zcp.equipname

WHERE 1 = 1
	AND zd.devicechname = '省级厂巷核心路由器'
	AND zch.fluxtime = trunc(zch.fluxtime, 'dd')
	AND zch.fluxtime >= to_date('2011-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
	AND zch.fluxtime <= to_date('2012-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
ORDER BY zch.fluxtime ASC

2012年10月25日 13:39
0 0

为什么还要写子循环呢,直接where里面限制条件不一样吗?

SELECT DISTINCT zch.fluxtime
	,zch.inavgvec
	,zch.outavgvec
	,zch.bandwidth
FROM zw_circuitflux_hour zch
INNER JOIN zw_devicechname zd ON zch.remark = zd.deremark
INNER JOIN zw_circuit_performance zcp ON zd.devicename = zcp.equipname

WHERE 1 = 1
	AND zd.devicechname = 'Ê¡¼¶³§ÏïºËÐÄ·ÓÉÆ÷'
	AND zch.fluxtime = trunc(zch.fluxtime, 'dd')
	AND zch.fluxtime >= to_date('2011-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
	AND zch.fluxtime <= to_date('2012-10-21 16:35', 'yyyy-mm-dd hh24:mi:ss')
ORDER BY zch.fluxtime ASC

2012年10月25日 13:38
0 0

信息最好能给全一点,最好把SQL执行计划发上来,另外条件列上是否有索引,是哪种类型的索引,另外最好把SQL执行计划发上来,才好分析,单纯从SQL上无法确定性能瓶颈在哪里。这几张表的数据量大概是多少?

2012年10月25日 13:13

相关推荐

    Oracle Sql语句转换成Mysql Sql语句

    本项目提供了一个Java源码工具,能够帮助用户便捷地将Oracle SQL语句转换为MySQL SQL语句。 Oracle SQL与MySQL SQL的主要差异在于以下几个方面: 1. **数据类型**:Oracle支持的数据类型如NUMBER、LONG、RAW等在...

    ORACLEsql语句优化

    ORACLEsql语句优化,性能优化,语句技巧优化

    ORACLE SQL性能优化系列

    ORACLE SQL性能优化系列 ORACLE SQL性能优化是数据库管理员和开发者非常关心的一个话题。为了提高数据库的性能,ORACLE 提供了多种优化技术。下面我们将详细介绍 ORACLE SQL 性能优化系列中的一些重要知识点。 一...

    Oracle sql语句优化规则汇总

    ### Oracle SQL语句优化规则详解 #### 一、选择正确的优化器 在Oracle数据库中,SQL语句的执行效率很大程度上取决于所选的优化器。Oracle提供了三种优化器模式: 1. **基于规则的优化器(RULE)**:这是Oracle...

    Oracle SQL语句性能优化

    Oracle SQL语句性能优化是数据库管理中的关键环节,直接影响到系统的响应速度和资源利用效率。本文将详细探讨优化Oracle SQL语句的几个核心策略。 1. 选择合适的优化器 Oracle 提供了三种优化器:RULE(基于规则)...

    SQL优化 SQL优化软件 SQL优化工具

    3. **建议与改写**:自动提供优化建议,包括修改SQL语句结构、创建或调整索引、优化连接方式等,有时甚至可以直接改写SQL语句以提高性能。 4. **历史记录与报告**:记录SQL语句的执行历史,生成性能报告,便于跟踪...

    Oracle SQL 语句优化

    Oracle SQL 语句优化,

    OracleSQL的优化.pdf

    Oracle SQL 优化 Oracle SQL 优化是数据库性能优化的关键部分。为了提高数据库的性能,我们需要从五个方面进行调整:去掉不必要的大型表的全表扫描、缓存小型表的全表扫描、检验优化索引的使用、检验优化的连接技术...

    Oracle sql语句大全

    Oracle sql语句大全. sql语句的优化资料

    oracle 中SQL语句优化

    oracle中SQL语句优化

    Oracle SQL语句优化技术分析

    ### Oracle SQL语句优化技术分析 #### 概述 Oracle SQL语句优化是数据库管理中的一个重要环节,通过优化SQL语句可以显著提升系统的响应速度、提高数据库资源的利用率以及改善用户体验。本文将从多个角度出发,详细...

    ORACLESQL性能优化.pptx

    SQL 语句优化的过程包括定位有问题的语句、检查执行计划、检查执行过程中优化器的统计信息、分析相关表的记录数、索引情况、改写 SQL 语句、使用 HINT、调整索引、表分析等。只有通过这种方式,才能达到最佳执行...

    ORACLE SQL语句优化技术分析.rar

    Oracle SQL语句优化是数据库管理中的关键环节,它关乎到系统的性能、效率和资源利用率。在Oracle数据库系统中,SQL(Structured Query Language)是用于查询、插入、更新和删除数据的标准语言。当处理大量数据时,...

    Oracle SQL语句优化技术分析.pdf

    【Oracle SQL语句优化技术分析】 Oracle SQL语句优化是提升数据库性能的关键环节,尤其是在处理大量数据时。本文主要从两个方面分析了SQL语句优化的技术:正确使用索引和合理安排SQL语句的书写方式。 1. 正确使用...

    压测Oracle的SQL语句的性能情况

    本文将深入探讨如何利用压力测试工具来评估和优化Oracle数据库中的SQL语句性能。 标题"压测Oracle的SQL语句的性能情况"暗示了我们关注的是在高负载情况下,Oracle数据库处理SQL查询的能力。压力测试(Pressure ...

    oracle Sql语句二

    oracle Sql语句二 oracle Sql语句二

    Oracle SQL语句优化53个规则详解

    下面根据提供的文档内容,详细解析Oracle SQL语句优化的53个规则中的部分内容。 首先,Oracle优化器的类型包括RULE(基于规则)、COST(基于成本)和CHOOSE(选择性)。在优化器模式的选择上,有几种方式可以设置,...

Global site tag (gtag.js) - Google Analytics