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

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

阅读更多

接: http://mikixiyou.iteye.com/blog/1491153

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

接: http://mikixiyou.iteye.com/blog/1491177

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

接: http://mikixiyou.iteye.com/blog/1491283

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

接: http://mikixiyou.iteye.com/blog/1491285

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


测试

我们在新建的表 cust_info­_bk2 进行测试。新表的记录是按照 brhid 排序插入,相同 brhid 的记录就近可能地保存在相邻的数据块上。

我们使用 brhid=’8088’ 的条件进行测试,符合这个条件的记录有 1.1W 条,占用的存储空间的数据块有 686 个。测试的操作过程如下所示:

SQL> set timing on

SQL> set autotrace trace exp stat

SQL>   SELECT COUNT(*)

    FROM CUST_INFO_bk2 t1

   WHERE 1 = 1

     and t1.lockflag = 0

     and T1.ASSET >= 50001

     and t1.brhid = '8088';  2    3    4    5    6 

 Elapsed: 00:00:00.72

 Execution Plan

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

Plan hash value: 974315855

 

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

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

 

| Id  | Operation                     | Name                | Rows  | Bytes | Co

st (%CPU)| Time     |

 

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

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

 

|   0 | SELECT STATEMENT              |                     |     1 |    20 |

391   (2)| 00:00:05 |

 

|   1 |  SORT AGGREGATE               |                     |     1 |    20 |

         |          |

 

|*  2 |   TABLE ACCESS BY INDEX ROWID | CUST_INFO_BK2       |     6 |   120 |

391   (2)| 00:00:05 |

 

|   3 |    BITMAP CONVERSION TO ROWIDS|                     |       |       |

         |          |

 

|*  4 |     BITMAP INDEX SINGLE VALUE | IND_CUST_INFO_BK2_1 |       |       |

         |          |

 

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

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

 

 

Predicate Information (identified by operation id):

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

 

   2 - filter("T1"."ASSET">=50001 AND TO_NUMBER("T1"."LOCKFLAG")=0)

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

 

Statistics

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

        332  recursive calls

          0  db block gets

        723  consistent gets

        689  physical reads

          0  redo size

        516  bytes sent via SQL*Net to client

        492  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          5  sorts (memory)

          0  sorts (disk)

          1  rows processed

从分析结果中,可以很明确地看到,执行计划没有任何变化,磁盘读和逻辑读下降到 689 723

注:这里的物理读也是 600 多,和上次取样的物理读差不多,为什么时间差异这么大?难道是磁盘的 IO 性能在两个时间段有很大的差异?

总而言之,语句执行所需要的数据块是大量降低了, 700 个数据块的请求,执行时间比 1W 个是要相差很大的。因此生产环境优化操作按照这个方法进行优化,应该是有明显收益。

语句执行的读取的数据块的数量我们通过重组表的方式使其减少了。这样即使这些块都在内存里,也比没重组前也是要快的。这个完全是可以成线性关系的,同在内存里,读取的数据块少,时间就会短。

因为需要调整初始化参数,所以这里就没有测试缓存表的优化方案了。

 

实施

根据测试结果,我们实施的主要内容是将 cust_info 的表的记录按照 brhid 排序重组。

实施步骤如下:

1.         备份表的数据,使用方法 CTAS

2.         备份表及其索引的 DDL 语句

3.         删除源表

4.         根据 DDL 重建表和索引

5.         使用 insert into select order by 方式插入记录数

6.         分析表和索引

在实施过程中因为网络不稳定,导致操作中断,所以我们采用了 ”BUCK INTO” 技术,即避免 CTAS 类似操作的大回滚段的操作压力和风险,又避免单条插入的性能问题。

该技术实现方式如下:

 declare

  cursor c_source is

    select * from cust_info_20111125;

  type type_arr_fectch is table of c_source%rowtype;

  arr_source type_arr_fectch;

begin

  open c_source;

  loop

    fetch c_source bulk collect

      into arr_source limit 1000;

    forall i in 1 .. arr_source.count

      insert into cust_info values arr_source (i);

    commit;

    exit when c_source%notfound;

  end loop;

  close c_source;

  commit;

end;

该方式实现每 1000 条插入一次,是按块的方式写入数据库的,速度是传统的单条插入的 5 倍以上。

总结

这个优化方案中涉及到众多知识点。理解这些知识点,更能有利于我们开发出更高效的程序。现将知识点罗列如下:

1.         数据块结构

2.         BITMAP 索引

3.         SQL 中判断条件

4.         输入变量的类型和字段类型必须一致;

a)         判断字段上不做任何转换如将 date 转换成 char 再比较;

5.         Forall bulk connect  技术实现批量快速插入

分享到:
评论

相关推荐

    sql脚本优化

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

    SQL优化指导示例2.pdf

    在这部分中,还可以看到有“NOSTATISTICS”标记,表明系统可能没有足够的统计信息来准确预估查询的成本和行数,这在优化过程中是需要关注的。 在优化SQL查询时,一个重要的方面是理解并合理使用聚合函数和分组...

    数据库面试题索引sql优化

    通过`TO_CHAR`函数将日期转换为字符串形式,然后按照年份进行分组统计平均工资。 **题目8.9:** 查询EMP员工表下每个部门工资前二名的员工信息。 **解答:** ```sql SELECT DEPTNO, ENAME, SAL FROM EMP E1 WHERE ...

    oracle sql优化

    总结来说,Oracle SQL优化是一个综合性的任务,需要考虑索引、连接方式、查询结构等多个方面。理解并应用上述知识点,能够帮助你更好地管理和优化你的Oracle数据库,实现更高效的SQL执行。通过持续学习和实践,你...

    SQL优化教程

    ### SQL优化教程 #### 一、SQL优化的重要性与原则 ...综上所述,SQL优化是一个综合性的过程,涉及从SQL语句本身到数据库架构设计的方方面面。通过对上述方法的合理应用,可以显著提高系统的查询性能和响应速度。

    Oracle Sql 优化

    总结,Oracle SQL优化是一个综合性的过程,涉及到SQL语句的编写、数据库结构的设计、索引的管理和优化器的配置等多个方面。通过对上述策略的理解和应用,可以显著提高Oracle数据库的性能和响应速度,为用户提供更好...

    基于Oracle的SQL优化典型案例分

    然而,随着数据量的增长,SQL查询的性能优化成为了一个关键问题。本篇将深入探讨“基于Oracle的SQL优化典型案例分析”,旨在帮助数据库管理员和开发人员提升SQL查询效率,降低系统负载,从而提高整体系统性能。 1. ...

    自动执行SQL语句&创建标准的Sql 存储过程

    例如,每当有新的订单插入,可以触发一个存储过程来计算并更新销售统计信息。 在实践中,这些功能极大地提高了数据库管理的效率和灵活性。然而,需要注意的是,过度依赖存储过程可能会增加维护难度,因为它们可能与...

    MySQL数据库优化SQL篇PPT课件.pptx

    本PPT课件主要讲述了MySQL数据库优化的重要知识点,特别是SQL优化方面的内容。从执行计划、SELECT语句、IN和EXIST语句、LIMIT语句、RAND函数、Order by、Group by、Distinct和Count等方面对MySQL数据库优化进行了...

    通过分析SQL语句的执行计划优化SQL语句

    5. **统计信息更新**:DBMS依赖于统计信息来做出最优的执行计划决策。定期更新表的统计信息,确保DBMS能准确预测数据分布,从而做出更明智的执行计划。 6. **并行执行**:某些DBMS支持并行执行计划,通过分配任务给...

    通过分析SQL语句的执行计划优化SQL

    每个操作都有一个成本值,表示完成该操作所需的资源量。数据库会选取总成本最低的执行计划。 二、查看SQL执行计划 在Oracle中,可以使用`EXPLAIN PLAN`或`DBMS_XPLAN`包来查看执行计划。例如,使用`EXPLAIN PLAN ...

    sql server 性能优化(生产中常用)

    查看SQL语句的执行计划是优化过程中的一个重要步骤。执行计划可以详细显示SQL语句如何被数据库解析、编译和执行。通过分析执行计划,可以了解是否有不必要的表扫描或索引扫描发生,以及是否有潜在的性能问题,例如...

    sql试题及答案,sql 行列转换,sql存储过程实例

    5. **聚合函数**:如COUNT、SUM、AVG、MAX和MIN,用于统计和计算数据。 6. **分组和聚合**:GROUP BY和HAVING子句结合使用,进行数据汇总和过滤。 7. **函数**:包括字符串函数、日期函数、数学函数等,用于数据处理...

    Oracle SQL优化实例讲解.pdf

    通过上述知识点的详细说明,我们可以了解到Oracle SQL优化涉及多个层面的内容,从具体的优化技巧到理论概念,从基本的操作到高级的性能分析工具,每一个环节都是优化过程中不可或缺的一环。通过实例讲解,能够更加...

    SQL常用优化脚本,优化SQL语句

    - **设置单用户模式**:`EXEC sp_dboption 'db_Name', 'singleuser', 'TRUE'`将数据库设置为只允许一个用户访问,通常在进行数据库检查或维护时使用。 - **检查并修复数据库**: - `dbcc checkdb('db_Name', repair...

    PLSQL基础,sql优化

    第六章“分组统计”介绍了GROUP BY和聚合函数(如COUNT, SUM, AVG, MAX, MIN)的用法,它们用于对数据进行汇总分析。在优化过程中,正确使用GROUP BY和HAVING子句可以显著提升查询性能。 第七章“子查询”阐述了...

    SQL性能优化

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

    HibernateTemplate分组统计

    2. **分组统计**:指通过SQL语句对查询结果按照一个或多个字段的值进行分组,并对每个分组进行计数或其他聚合操作的过程。 3. **Spring框架**:一个开源的应用程序框架,旨在简化企业级应用程序的开发过程。Spring...

    用SQL实现统计报表中的小计与合计的方法详解

    这个过程可以被扩展成为一个通用的存储过程,接受参数,动态地处理不同的列和分组条件,从而更灵活地满足不同报表的需求。 总结来说,利用临时表实现统计报表中的小计与合计,虽然在数据量大时可能面临内存压力,但...

Global site tag (gtag.js) - Google Analytics