`
qq_22530757
  • 浏览: 19484 次
社区版块
存档分类
最新评论

一个2600万数据的SQL统计,SQL调优

阅读更多

昨天工程师反映客户一个sql的统计等的n慢,我plsql跑了一下,需要1110秒,近20分钟,这个现状肯定无法忍受。后进行分析调整之后查询速度在6-12秒之内,调整步骤如下:

现状:linux, oracle 10g ,4G内存,sga1.5G, 调整shared_pool300M,这个shared_pool的调整有些怀疑。先搁置。
表BCM_MONTHGASFEE 数据=26494361
原sql
-————————————————————————
select substr(f.dataenddate, 0, 7) gasdate,
       min(o.name) officename,
       to_char(sum(f.gasmonthcost)) cost
  from BCM_MONTHGASFEE f, OPM_ORGAN O
 where f.officecode = o.code
   and f.ChargeMethodCode = '1'
   and (f.bcharge = 0 or
       (f.bcharge = 1 and
       f.ChargeTime >
       to_timestamp('2010-08-04 00:00:00', 'yyyy-mm-dd hh24:mi:ss')))
   and (f.officecode like '110%'
   and f.dataenddate between '2005-01-01' and '2010-07-31')  
 group by substr(f.dataenddate, 0, 7), o.code
 order by substr(f.dataenddate, 0, 7), o.code

OPM_ORGAN O=90条
——————————————————————————

进行sql语句分析,得结果如下:
select substr(f.dataenddate, 0, 7) gasdate,
            f.officecode,
            to_char(sum(f.gasmonthcost)) cost
       from BCM_MONTHGASFEE f
      where 
         ((f.ChargeTime > to_timestamp('2009-08-04 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
        and f.bcharge = 1) or f.bcharge = 0 )    
        and f.ChargeMethodCode = '1'
        and f.dataenddate between '2005-01-01' and '2010-07-31'
        and f.officecode like '110%'  
      group by substr(f.dataenddate, 0, 7), f.officecode
-----------------------------------

 

劳动所得 不喜勿喷:获取【下载地址】


进行计划分析
 explain plan for
   ....{sql语句}
 select * from table(dbms_xplan.display());
是全表扫描,后来建立索引1:officecode, dataenddate ;索引2:bcharge, ChargeTime 进行逐步分析,仍然是全表扫描。
后删除索引1和索引2,建立索引3:OFFICECODE, DATAENDDATE, BCHARGE, CHARGETIME, ChargeMethodCode, 到最后仍然是全表扫描,后来发现,原因在
sum(f.gasmonthcost)这个条语句上,怀疑是sum,去掉sum仍然全表,后来看因为gasmonthcost列未在索引范围之内,后把该索引加上,最终索引是:create index IDX_BCM_MONTHGASFEE_OFF1
 on BCM_MONTHGASFEE (OFFICECODE, DATAENDDATE, BCHARGE, CHARGETIME, ChargeMethodCode, GASMONTHCOST) local;

语句调整如下:
select a.gasdate, b.name, a.cost
   from (select substr(f.dataenddate, 0, 7) gasdate,
            f.officecode,
            to_char(sum(f.gasmonthcost)) cost
       from BCM_MONTHGASFEE f
      where 
         ((f.ChargeTime > to_timestamp('2009-08-04 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
        and f.bcharge = 1) or f.bcharge = 0 )    
        and f.ChargeMethodCode = '1'
        and f.dataenddate between '2005-01-01' and '2010-07-31'
        and f.officecode like '110%'  
      group by substr(f.dataenddate, 0, 7), f.officecode
      )a, opm_organ b
  where b.officecode=a.code
  order by a.gasdate, a.officecode;

执行Sql,查询出结果25秒.

经过以上的Sql调整逻辑读和物理读已经大大缩小了
但是逻辑读还是特别大
   112514  consistent gets
   72207  physical reads
下面进行调整逻辑读
调整sql如下:
--------------------------------------------

select a.gasdate, b.name, a.cost
   from (select gasdate, officecode,  to_char(sum(cost)) cost
        from (select substr(f.dataenddate, 0, 7) gasdate,
                 f.officecode,
                 f.gasmonthcost cost
            from BCM_MONTHGASFEE f
           where 
              (f.ChargeTime > to_timestamp('2009-08-04 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
             and f.bcharge = 1)     
             and f.ChargeMethodCode = '1'
             and f.dataenddate between '2005-01-01' and '2010-07-31'
             and f.officecode like '110%'        
           union
           select substr(f.dataenddate, 0, 7) gasdate,
                 f.officecode,
                 f.gasmonthcost cost
            from BCM_MONTHGASFEE f
           where f.bcharge = 0
             and f.ChargeMethodCode = '1'
             and f.dataenddate between '2005-01-01' and '2010-07-31'
             and f.officecode like '110%'  
             ) x       
     group by x.gasdate, x.officecode
    )a, opm_organ b
  where a.officecode=b.code
  order by a.gasdate, a.officecode;

经调整之后:
 54533  consistent gets
  8392  physical reads

执行Sql,查询出结果9秒.
达到预期。

但是数据和原sql查询出来的数据有出入,调整之后的数据512条,原sql查询是477条,有些疑惑!!!

但是查询数的数据一样的啊,奇怪!!

 ---一下查询结果一样 26494957条数据
  select count(1)
  from BCM_MONTHGASFEE f, OPM_ORGAN O
 where f.officecode = o.code  ;
 
  select count(1)
  from BCM_MONTHGASFEE f;


---关于sql优化,望大家讨论

 

劳动所得 不喜勿喷:获取【下载地址】

0
11
分享到:
评论

相关推荐

    SQL错误状态的提示信息

    - **01657 一次只能在一个数据库中生效**:表示一次只能在一个数据库中生效。 - **01667 不能使用远程表参与本地查询**:表示不能使用远程表参与本地查询。 - **01670 缺少必需的资源**:表示缺少执行操作所必需的...

    如何查看sql sp4补丁有没有安装

    在IT领域,尤其是数据库管理中,保持软件...定期检查并安装最新的Service Pack和Cumulative Updates是数据库管理员的重要工作之一,因为这些更新通常包含重要的安全修复和性能优化,有助于保护数据安全和提升系统性能。

    sqlserver 2000从哪里看版本

    - **8.00.2039**:表示 SQL Server 2000 SP4 (Service Pack 4),这是 SQL Server 2000 的最后一个官方服务包。 #### 三、示例分析 假设执行 `SELECT @@VERSION;` 查询返回的结果为: ``` Microsoft SQL Server ...

    wildcard_attacks(利用SQL通配符进行DOS攻击)

    这导致了一种更有效的攻击方式——通过提供多个分隔的通配符攻击字符串,使得SQL查询变得更复杂,从而增加服务器的负担。 #### 其他应用场景 这种攻击不仅仅限于Web应用程序,还可以发生在任何后端具有数据库和...

    Sql Server 定时 作业 任务 创建 详细步骤

    本文档将详细介绍如何在SQL Server Management Studio (SSMS) 中创建一个定时作业任务,适合初次接触这一功能的用户。 #### SQL Server 版本信息 - **作者**:htl258 (Tony) - **日期**:2010-04-29 19:07:45 - **...

    数据库实验2-交互式SQL(二)数据操作.docx

    2. 创立表,要求:使用SQL语句创立一个雇员信息表person、一个月薪表salary和一个部门表department。所创立表的结构如下所示: 表1 雇员信息表person | 字段名 | 数据类型 | 字段长度 | 是否允许为空 | 说明 | | -...

    DB2错误消息号参考

    - **SQL2600-SQL2699**:这类错误可能涉及数据导入导出操作。 - **SQL2700-SQL2799**:这部分错误可能与数据库的集群、高可用性相关。 - **SQL2800-SQL2899**:此类错误可能涉及数据库的性能调优、监控功能。 - **...

    AR人脸库数据集(2600张图片).zip

    AR人脸库数据集(2600张图片).zipAR人脸库数据集(2600张图片).zipAR人脸库数据集(2600张图片).zipAR人脸库数据集(2600张图片).zipAR人脸库数据集(2600张图片).zipAR人脸库数据集(2600张图片).zipAR人脸库...

    诺基亚2600手机数据线驱动

    这个驱动适用于市场上常见的CA-46数据线,CA-46是诺基亚为多种老款手机设计的一款通用数据线,包括诺基亚2600。它通常配备USB接口,方便用户将手机连接到电脑的USB端口。驱动程序的安装过程可能包括以下步骤: 1. ...

    jdbc连接sql.txt

    在早期的数据库环境中,SQL Server 2000 是一个非常流行的选择。对于使用 Java 开发的应用程序来说,通过 JDBC (Java Database Connectivity) 连接到 SQL Server 2000 是一种常见的方式。 ##### 1. 验证 SQL Server...

    drone目标检测无人机数据集

    这个数据集由大疆无人机机型生成,确保了图像的多样性和实际应用场景的广泛性。 **一、无人机数据集的构成** 该数据集共包含2600多张标注好的图片,这意味着每一张图片都经过专业人员精确地进行了目标定位和分类,...

    IBM DB2故障速查手册

    通过以上对IBM DB2 V9.0故障速查手册的分析,我们可以看出该手册为DB2数据库管理员和开发人员提供了一个全面的错误代码参考指南。通过详细了解这些错误代码及其解决方案,可以有效提高DB2系统的稳定性和可用性。此外...

    db2 sqlcode中文说明

    当一个SQL语句被执行后,SQLCA中的SQLCODE字段会包含一个整数值,用来表明该语句是否成功执行或执行过程中发生了什么错误。SQLCODE值可以是正数、负数或零,具体含义如下: - **正数**:表示成功的操作,通常为+100...

    数据库应用(SQL Server):01 Introduction.ppt

    【数据库应用(SQL Server):01 Introduction.ppt】是一个介绍数据库应用的课程,主要针对SQL Server技术。课程内容不仅涵盖了数据库的基础知识,也包括操作系统、应用程序开发等多个方面。以下是根据提供的部分...

    OceanStor_V3_融合存储_V300R003&V300R005;_性能调优培训_V1.0

    - **调优前的准备工作**:包括了解业务应用的特点、数据特性、明确调优目标、备份数据等。 - **监控与分析性能数据**:利用工具监控关键性能指标,并分析数据找出瓶颈所在。 - **逐一调整配置**:每次只改变一种配置...

    AST2600 Datasheet

    首先,AST2600是一款 Remote Management Processor,提供了远程管理功能,能够实现在服务器、数据中心和云计算环境中进行远程管理和监控。 从数据手册中,我们可以了解到AST2600的 ordering 信息,包括Top Marking ...

    电影数据集2023.rar

    该数据集还包含来自270,000位用户的全部45,000部电影的2600万个分级的文件。等级为1-5,可从GroupLens官方网站获得。 该数据集包含以下文件: films_metadata.csv:主电影元数据文件。包含完整电影镜头数据集中的45...

    2600v09 Datasheet

    在电气规格方面,AST2600可能具有多个电源域,如R3VDD和R4VDD被合并为一个“RVDD”电源域,增强了电源管理的灵活性和效率。此外,PV33D引脚的更改表明芯片对不同电源电压的需求进行了调整,以适应更广泛的电源配置。...

    水果刀检测数据集+2600数据

    1、水果刀检测数据集,从COCO2017数据集中提取得到,并分别转成了txt和xml两种格式的标签,可用于YOLO 水果刀检测; 2、目标类别名:knife; 3、数量:2647 4、...

    超过45000部电影的元数据集

    超过45000部电影的元数据集 数据说明: 这些文件包含完整MovieLens数据集中列出的所有45.000部电影的元数据...该数据集还包含270,000用户对所有45000部电影的2600万个评分。评分是1-5分,并已从官方网站GroupLens获得。

Global site tag (gtag.js) - Google Analytics