`
mikixiyou
  • 浏览: 1088080 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:349916
社区版块
存档分类
最新评论

一个分组统计SQL的优化过程(1)

阅读更多

这是一个开发和  DBA   双方合作下,从开发的角度去思考如何优化  SQL   的完整的过程。在本文中,介绍如何阅读执行计划、如何理解位图索引、如果使用  10046 event   分析、记录是如何保存在数据块中。相信这篇文章能帮助你理解数据库的数据块结构、理解  SQL   的执行计划。希望能对大家有帮助。

 

事情的过程是这样的。应用系统的某一个查询功能无法出结果,导致了某关键业务不能完成。在开发人员的协助下,我们将该查询功能调用的  SQL   语句取出来。如下所示:

SELECT COUNT(*)

   FROM CUST_INFO   t1 

   WHERE 1 = 1

    and t1.lockflag = 0

    and T1.ASSET >= 50000

    and T1.MOBILE IS NOT NULL

    and t1.brhid='8088'

这个  SQL   中的  Brhid    lockflag    asset   都是输入变量。

  SQL   结构上看,它属于统计类型的查询语句,这里是根据  brhid (   营业部代码  )   进行分组求和。

首先,我们在生产环境和测试环境对这个  SQL   做验证性测试,以证实客户说法是否属实。

测试结果显示它第一次执行很慢,时间超过  20   秒,甚至  100   秒。而第二次、第三次后就变快。每换一个  brhid   的值,执行速度又从慢到快。

  WEB   类型的应用中,超过  20   秒以上响应时间,是不可接受的。其实,对于用户而言,这个功能已经完全不能用了。

SQL   看上去非常简单,这个能从什么方面着手优化呢?

分析

语句分析

在数据库系统中,任何一个  SQL   出现的性能问题,首先是分析它的执行计划和统计信息。

因为这个  SQL   的现象是可以问题重现的,所以我们使用  ”set autotrace trace exp stat”   来进行分析。

打开  cmd   窗口,执行  SQLPLUS   ,登录数据库后,执行  set autotrace   ,如下所示:

set autotrace trace exp stat

set timing on

这句是将  trace   功能打开,这是  sqlplus   的一个调试功能。然后执行我们要分析的  SQL   语句。

结果如下:

Execution Plan

----------------------------------------------------------

Plan hash value: 840048105

-------------------------------------------------------------------------------------------------

| Id   | Operation             | Name          | Rows   | Bytes | Cost (%CPU)| Time      |

-------------------------------------------------------------------------------------------------

|    0 | SELECT STATEMENT     |               |      1 |     21 |    540   (1)| 00:00:07 |

|*   2 | TABLE ACCESS BY INDEX ROWID | CUST_INFO |   1866 | 39186 |    540   (1)|00:00:07 |

|    3 | BITMAP CONVERSION TO ROWIDS|          |        |        |      |           |

|*   4 | BITMAP INDEX SINGLE VALUE|IND_CUST_INFO_5 |     |     |      |           |

 -------------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

    2 - filter("ASSET">50000 AND "MOBILE" IS NOT NULL AND TO_NUMBER("T1"."LOCKFLA

G")=0)

    4 - access("BRHID"= '8088' )

Statistics

----------------------------------------------------------

           1   recursive calls

            db block gets

         745   physical reads

            redo size

         516   bytes sent via SQL*Net to client

         492   bytes received via SQL*Net from client

            SQL*Net roundtrips to/from client

            sorts (memory)

            sorts (disk)

            rows processed

这个结果虽然看上去很复杂,但我们可以化繁为简,一点一点地去看。

分享到:
评论

相关推荐

    sql脚本优化

    下面是sql语句优化的一些提示要点,主要讲述的是操作符优化过程。 IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。 但是用IN的SQL性能总是比较低的,从sql执行的步骤来...

    sql server2005/2008 性能优化大全 .pptx

    SQL2005性能优化大全,sqlserver性能优化,包括:什么叫做索引、利用索引优化sqlserver查询、使用数据库分区表提高程序检索效率、提高数据库查询效率的实用方法、SQL数据进行排序、分组、统计技巧;SQL Server查询...

    SQL基础编写与调试优化

    第五部分 SQL优化 优化器 SQL语句执行过程 SQL优化术语 第一部分 SQL基础 SQL简介 发展历史 SQL语句分类 DDL[Data Definition Language] DML[Data Manipulation Language] DQL [Data Query Language] DCL [Data...

    SQL性能优化

    由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。  NOT IN  此操作是强列推荐不使用的,因为不能应用表的索引。  推荐方案:用NOT EXISTS 或...

    Oracle数据库SQL语句优化策略

    基本的Sql编写注意事项 尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替 用IN写出来...由此可见用 IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    4.6 基于集合的方法和迭代/过程方法的比较,以及一个优化练习2 4.7 总结 第5章 算法和复杂性 5.1 你有一个1夸特的硬币吗? 5.1.1 如何从零钱罐中取回1夸特钱 5.1.2 有时零钱罐中没有1夸特的硬币 5.2 如何度量...

    SQLServer2008技术内幕T-SQL查询包含源代码及附录A

    4.6 基于集合的方法和迭代/过程方法的比较,以及一个优化练习208 4.7 总结214 第5章 算法和复杂性215 5.1 你有一个1夸特的硬币吗?215 5.1.1 如何从零钱罐中取回1夸特钱216 5.1.2 有时零钱罐中没有1夸特的硬币216 ...

    SQL培训第一期

    当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值;如果表之间有匹配行,则整个结果集行包含基表的数据值。 1.6.4.2 语法 select A.*, B.* from student_A A full outer join student_B B on A.Uuid...

    SQLServer 优化SQL语句 in 和not in的替代方案

    由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 推荐在业务密集的SQL当中尽量不采用IN操作符 NOT IN 此操作是强列推荐不使用的,因为它不能应用...

    Microsoft+SQL+Server+2008技术内幕:T-SQL查询_源代码及附录 中文版

    4.6 基于集合的方法和迭代/过程方法的比较,以及一个优化练习208 4.7 总结214 第5章 算法和复杂性215 5.1 你有一个1夸特的硬币吗?215 5.1.1 如何从零钱罐中取回1夸特钱216 5.1.2 有时零钱罐中没有1夸特的硬币...

    程序员的SQL金典.rar

    通过对实际案例开发过程的详细分析,使读者掌握 SQL的综合应用技巧。 内容简介 本书主要介绍SQL的语法规则及在实际开发中的应用,并且对SQL在MySQL、MS SQL Server、Oracle和DB2中的差异进行了分析。本书分为3部分:...

    Oracle数据库SQL语句优化总结

    由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL不能转换了。  推荐方案:在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替。  

    ORACLE SQL语句优化技术要点解析

    由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。  推荐方案:在业务密集的SQL当中尽量不采用IN操作符。 NOT IN操作符  

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    10.2 SQL优化 257 10.2.1 测试执行计划 257 10.2.2 跨多个执行的测试 260 10.2.3 测试查询改变的影响 263 10.2.4 寻找其他优化机会 266 10.2.5 将子查询因子化应用到PL/SQL中 270 10.3 递归子查询 273 ...

    SQL sever 实训

    --创建存储过程P_Sale1,统计每种产品的销售数量和销售金额 CREATE PROCEDURE P_Sale1 AS SELECT Product.ProNO,ProName ,Price ,SUM(Quantity),SM=SUM(Price*Quantity) FROM Proout,Product WHERE Product.ProNO=...

    数据库调试工具

    3、可执行多条sql语句,或各种分组统计语句。前提是数据库支持该语法。 例1、执行简单的Sql语句:select,insert,delete,update 等 例2、[sqlserver2008]执行T-Sql语句: declare @aa int set @aa=123*2+456*3-...

    oracle实验报告

    [例3-1] 问题:编写一个过程,求和运算。 SET SERVEROUTPUT ON; DECLARE a number:=1; BEGIN a:=a+5; DBMS_OUTPUT.PUT_LINE('和为:'||TO_CHAR(a)); END; / 【例3-2】:使用%TYPE声明变量,输出制定表中的相关...

Global site tag (gtag.js) - Google Analytics