某业务报表SQL:
执行时间3小时.

asncn3a24zu67
SELECT NVL(XHSD0001.CG_F_GHSMC_TONGJI_SPBS_CGB(FHMX.SPBS), '0000000000') KHBH,FHMX.CGBMBH,ROUND(SUM(DECODE(FHMX.CLZT, 'e', FHMX.SFSL, FHMX.SSSL)), 0) SL,SUM(FHMX.MY) MY,SUM(FHMX.SY) SY,:B2 BQNY,'F21' YWLB,COUNT(DISTINCT FHMX.SPBS) PZS,:B1 JSNYFROM XHSD0001.PUB_FHTZDMXB FHMX, XHSD0001.PUB_YWLBBMB BWHERE FHMX.CGBMBH = :B3AND FHMX.FDRQ BETWEEN :B2 AND :B1 + 1AND FHMX.KBBZ = '1'AND FHMX.CWJSDW = '1'AND FHMX.CLZT <> 'K'AND FHMX.YWLB = B.LBBM_PKAND B.YWLB = 'F21'GROUP BY NVL(XHSD0001.CG_F_GHSMC_TONGJI_SPBS_CGB(FHMX.SPBS),'0000000000'),FHMX.CGBMBHSQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1627485523----------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                               | Name                         | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |                              |     1 |  2053 |  1045K  (1)| 03:29:02 |       |       |
|   1 |  HASH GROUP BY                          |                              |     1 |  2053 |  1045K  (1)| 03:29:02 |       |       |
|   2 |   VIEW                                  | VW_DAG_0                     |  9611 |    18M|  1045K  (1)| 03:29:02 |       |       |
|   3 |    HASH GROUP BY                        |                              |  9611 |   488K|  1045K  (1)| 03:29:02 |       |       |
|*  4 |     FILTER                              |                              |       |       |            |          |       |       |
|   5 |      NESTED LOOPS                       |                              |  9611 |   488K|  1045K  (1)| 03:29:02 |       |       |
|   6 |       NESTED LOOPS                      |                              |  3378K|   488K|  1045K  (1)| 03:29:02 |       |       |
|   7 |        TABLE ACCESS BY INDEX ROWID      | PUB_YWLBBMB                  |     2 |    16 |     2   (0)| 00:00:01 |       |       |
|*  8 |         INDEX RANGE SCAN                | PUB_YWLBBMB_YWLB             |     2 |       |     1   (0)| 00:00:01 |       |       |
|*  9 |        INDEX RANGE SCAN                 | PUB_FHD_CG_SFKGL_CGBMBH_KHBH |  1689K|       |   141K  (1)| 00:28:19 |       |       |
|* 10 |       TABLE ACCESS BY GLOBAL INDEX ROWID| PUB_FHTZDMXB                 |  4222 |   181K|   903K  (1)| 03:00:44 | ROWID | ROWID |
----------------------------------------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------4 - filter(TO_NUMBER(:B1)+1>=:B2)8 - access("B"."YWLB"='F21')9 - access("FHMX"."CGBMBH"=:B3 AND "FHMX"."YWLB"="B"."LBBM_PK")filter("FHMX"."CLZT"<>'K' AND "FHMX"."YWLB"="B"."LBBM_PK")10 - filter("FHMX"."FDRQ"<=TO_NUMBER(:B1)+1 AND "FHMX"."FDRQ">=:B2 AND "FHMX"."KBBZ"='1' AND "FHMX"."CWJSDW"='1')26 rows selected

分析:
1.从执行计划中看到关联方式为NL,rows为2,首先看到驱动表,将谓词条件代入count一把,返回行数18行,被驱动表为大表,5亿行数据,SQL返回行数为几千行,关联方式没有问题。

2.从执行计划中可以看出被驱动表为分区表,并且走了全局索引。

3.从执行计划中可以看出被驱动表进行了回表再过滤,这个问题对于5亿行的表来说会当场暴毙。

表分区信息:

select table_name,partition_name,high_value from dba_tab_partitions where table_name = 'PUB_FHTZDMXB';
TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
------------------------------ ------------------------------ --------------------------------------------------------------------------------
PUB_FHTZDMXB                   FUTURE                         MAXVALUE
PUB_FHTZDMXB                   D2010                          TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
PUB_FHTZDMXB                   D2009                          TO_DATE(' 2010-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIASQL> select * from dba_part_key_columns where name = 'PUB_FHTZDMXB';OWNER                          NAME                           OBJEC COLUMN_NAME          COLUMN_POSITION
------------------------------ ------------------------------ ----- -------------------- ---------------
XHSD0001                       PUB_FHTZDMXB                   TABLE FDRQ                               1SQL> select count(*) from xhsd0001.PUB_FHTZDMXB partition(D2010);COUNT(*)
----------29892361SQL> select count(*) from xhsd0001.PUB_FHTZDMXB partition(D2009);COUNT(*)
----------119325995SQL> select count(*) from xhsd0001.PUB_FHTZDMXB;                 COUNT(*)
----------551617766

可以看到被驱动表三个分区的数据量,分区健为FDRQ.
并且回表过滤的条件为分区健的条件.所以关键问题就是分区健没又加入到被驱动表索引的问题。

索引列:

PUB_FHD_CG_SFKGL_CGBMBH_KHBH
COLUMN_NAME          INDEX_NAME
-------------------- ------------------------------
CGBMBH               PUB_FHD_CG_SFKGL_CGBMBH_KHBH
SWSHD                PUB_FHD_CG_SFKGL_CGBMBH_KHBH
YWLB                 PUB_FHD_CG_SFKGL_CGBMBH_KHBH
CLZT                 PUB_FHD_CG_SFKGL_CGBMBH_KHBH
CGWJSL               PUB_FHD_CG_SFKGL_CGBMBH_KHBH
CGBMBH               PUB_FHD_CG_SFKGL_CGBMBH_KHBH
SWSHD                PUB_FHD_CG_SFKGL_CGBMBH_KHBH
YWLB                 PUB_FHD_CG_SFKGL_CGBMBH_KHBH
CLZT                 PUB_FHD_CG_SFKGL_CGBMBH_KHBH
CGWJSL               PUB_FHD_CG_SFKGL_CGBMBH_KHBH

谓词列的选择性:

select a.column_name,
b.num_rows,
a.num_distinct cardinality,
round(a.num_distinct / b.num_rows * 100, 2) selectivity,
a.histogram,
a.num_buckets
from dba_tab_col_statistics a ,dba_tables b
where a.owner = b.owner
and a.table_name = b.table_name
and a.owner = 'XHSD0001'
and a.table_name = 'PUB_FHTZDMXB'
and a.column_name in ('CGBMBH','FDRQ','KBBZ','CWJSDW','CLZT','YWLB');COLUMN_NAME            NUM_ROWS CARDINALITY SELECTIVITY HISTOGRAM       NUM_BUCKETS
-------------------- ---------- ----------- ----------- --------------- -----------
CGBMBH                550420927          23           0 FREQUENCY                16
YWLB                  550420927          14           0 FREQUENCY                12
KBBZ                  550420927           2           0 FREQUENCY                 2
CWJSDW                550420927           2           0 FREQUENCY                 2
CLZT                  550420927          12           0 FREQUENCY                 8
FDRQ                  550420927    63750144       11.58 NONE                      1

优化方案:
1.B1绑定变量的数据类型定义存在问题,发生了转换,建议调整.

2.大表索引要包含where条件后的所有列,等值列在前,要避免回表再过滤,尤其是分区键条件FDRQ要加入到索引中

3.PUB_FHTZDMXB总行数(5亿),共三个分区,2009年/2010年/其他分区,2009年+2010年共1.2亿,可以尝试建立本地索引,避免使用全局索引扫描2009与2010数据,减少扫描数据量

Oracle 大表回表过滤优化案例相关推荐

  1. oracle 10g 还原表格,oracle 10g 闪回表恢复

    oracle 从10g开始增加了闪回功能.9i 用drop命令删除表之后很难恢复,10g drop之后并未真正删除,而是放入了闪回区域,如果是误操作,可以马上从闪回区域恢复误删除的的表.今天使用了一下 ...

  2. 【Oracle】闪回表

    语法: FLASHBACK TABLE [ schema. ] table [, [ schema. ] table ]... TO { { { SCN | TIMESTAMP } expr| RES ...

  3. oracle大对象实例_oracle 数据迁移案例 从 8.1.7.4到9.2.0.8

    旧数据库环境 操作系统为alpha 数据库版本为8.1.7.4 用户名 oracle  ip地址 192.168.1.1 数据库实例名为orcl 需要迁移到IBM aix 5308 数据库版本为 or ...

  4. oracle 索引回表,oracle 索引简单总结

    建立索引时先进行排序,逻辑上分为Root(根块),Branch(茎块),leaf(叶子块).leaf中存在索引列的值.长度.和所在rowid,茎块存了指向具体茎块的指针,root块同理.这是逻辑上的划 ...

  5. B+树索引(10)之回表的代价

    B+树索引(10)之回表的代价 前言 什么是回表 回表操作一般发生在二级索引中,查询的列不全部包含在二级索引中,需要根据二级索引叶子节点中的主键id,再去聚簇索引中查询完整的用户数据,这个查询过程称为 ...

  6. MySQL - 索引优化案例实操

    文章目录 生猛干货 DB Version Table Case 1 : 联合索引第一个字段用范围不一定会走索引 优化一 强制走索引 force index(idx_name_age_position) ...

  7. 大主子表关联的性能优化方法

    [摘要] 主子表是数据库最常见的关联关系之一,最典型的包括合同和合同条款.订单和订单明细.保险保单和保单明细.银行账户和账户流水.电商用户和订单.电信账户和计费清单或流量详单.当主子表的数据量较大时, ...

  8. mysql 大表更新数据类型_MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)...

    殊不知,在N年前被奉为"圣经"的数据库设计3范式早就已经不完全适用了.这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用. 由于MySQL数据库是基于行(Ro ...

  9. Oracle 学习之建表、索引、同义词以及SQL优化

    Oracle 学习之建表.索引.同义词以及SQL优化: 一.Oracle 建表: 1.建表语句: --创建表 create table test ( id varchar2(200) primary ...

最新文章

  1. 2010年7月blog汇总:OpenTest、MetaModelEngine和敏捷个人
  2. 直流电路相关计算机,计算机专业用复杂直流电路习题(各种方法运用).doc
  3. Aarch64汇编语言
  4. CentOs中怎样打开默认网卡并查看ip
  5. linux运维选择题,初学Linux练习题
  6. 直播连麦贾扬清,谈谈他所理解的四大 AI 落地问题 | 攻“疫”技术公开课
  7. index mysql_mysql 原理~ index的详解
  8. c++ hsv 红色范围_维生素C的定量测定—2,6二氯酚靛酚法
  9. 近些年CPU的性能是不是快到天花板了?
  10. 周莫凡python_机器学习 | 莫烦Python
  11. IE associate Fix
  12. 时间与空间的相对性——思想实验推导狭义相对论(四)
  13. 破解tomcat管理员密码
  14. LINTCODE——吹气球
  15. rundll32.exe 用法概述 [转]
  16. matlab省略,matlab的省略号
  17. 取消pycharm双击shift出现搜索框,但新版找不到ide.suppress.double.click.handler的问题解决
  18. Matlab中interp2和interpn的差异
  19. 通过脚本自由设计游戏UI风格
  20. [Scene Graph] Neural Motifs: Scene Graph Parsing with Global Context 论文解读

热门文章

  1. 江苏省计算机二级考试基础知识,江苏省计算机二级考试基础知识部分
  2. 核心单词Word List 43
  3. GCC soft float ABI接口gcc-arm-Linux-gnueabi/ARMARCH7gnu和gcc-arm-linux-gnueabihf以及ARMARCH7sfgnu
  4. javascript字符串代码在前端的美化、格式化展示处理
  5. 联想开机启动项按哪个_联想电脑怎么进入bios|联想电脑按什么键进bios设置U盘启动...
  6. 一篇ACSAC的关于ECC的论文分析
  7. 自动创建主背分离修片图层
  8. 怎么通过堡垒机创建虚拟服务器,怎么通过堡垒机连接云服务器
  9. qq游戏大厅2014 v3.4 官方正式版
  10. 谷歌浏览器Chrome的扩展程序安装目录