Oracle 大表回表过滤优化案例
某业务报表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 大表回表过滤优化案例相关推荐
- oracle 10g 还原表格,oracle 10g 闪回表恢复
oracle 从10g开始增加了闪回功能.9i 用drop命令删除表之后很难恢复,10g drop之后并未真正删除,而是放入了闪回区域,如果是误操作,可以马上从闪回区域恢复误删除的的表.今天使用了一下 ...
- 【Oracle】闪回表
语法: FLASHBACK TABLE [ schema. ] table [, [ schema. ] table ]... TO { { { SCN | TIMESTAMP } expr| RES ...
- 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 ...
- oracle 索引回表,oracle 索引简单总结
建立索引时先进行排序,逻辑上分为Root(根块),Branch(茎块),leaf(叶子块).leaf中存在索引列的值.长度.和所在rowid,茎块存了指向具体茎块的指针,root块同理.这是逻辑上的划 ...
- B+树索引(10)之回表的代价
B+树索引(10)之回表的代价 前言 什么是回表 回表操作一般发生在二级索引中,查询的列不全部包含在二级索引中,需要根据二级索引叶子节点中的主键id,再去聚簇索引中查询完整的用户数据,这个查询过程称为 ...
- MySQL - 索引优化案例实操
文章目录 生猛干货 DB Version Table Case 1 : 联合索引第一个字段用范围不一定会走索引 优化一 强制走索引 force index(idx_name_age_position) ...
- 大主子表关联的性能优化方法
[摘要] 主子表是数据库最常见的关联关系之一,最典型的包括合同和合同条款.订单和订单明细.保险保单和保单明细.银行账户和账户流水.电商用户和订单.电信账户和计费清单或流量详单.当主子表的数据量较大时, ...
- mysql 大表更新数据类型_MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)...
殊不知,在N年前被奉为"圣经"的数据库设计3范式早就已经不完全适用了.这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用. 由于MySQL数据库是基于行(Ro ...
- Oracle 学习之建表、索引、同义词以及SQL优化
Oracle 学习之建表.索引.同义词以及SQL优化: 一.Oracle 建表: 1.建表语句: --创建表 create table test ( id varchar2(200) primary ...
最新文章
- 2010年7月blog汇总:OpenTest、MetaModelEngine和敏捷个人
- 直流电路相关计算机,计算机专业用复杂直流电路习题(各种方法运用).doc
- Aarch64汇编语言
- CentOs中怎样打开默认网卡并查看ip
- linux运维选择题,初学Linux练习题
- 直播连麦贾扬清,谈谈他所理解的四大 AI 落地问题 | 攻“疫”技术公开课
- index mysql_mysql 原理~ index的详解
- c++ hsv 红色范围_维生素C的定量测定—2,6二氯酚靛酚法
- 近些年CPU的性能是不是快到天花板了?
- 周莫凡python_机器学习 | 莫烦Python
- IE associate Fix
- 时间与空间的相对性——思想实验推导狭义相对论(四)
- 破解tomcat管理员密码
- LINTCODE——吹气球
- rundll32.exe 用法概述 [转]
- matlab省略,matlab的省略号
- 取消pycharm双击shift出现搜索框,但新版找不到ide.suppress.double.click.handler的问题解决
- Matlab中interp2和interpn的差异
- 通过脚本自由设计游戏UI风格
- [Scene Graph] Neural Motifs: Scene Graph Parsing with Global Context 论文解读
热门文章
- 江苏省计算机二级考试基础知识,江苏省计算机二级考试基础知识部分
- 核心单词Word List 43
- GCC soft float ABI接口gcc-arm-Linux-gnueabi/ARMARCH7gnu和gcc-arm-linux-gnueabihf以及ARMARCH7sfgnu
- javascript字符串代码在前端的美化、格式化展示处理
- 联想开机启动项按哪个_联想电脑怎么进入bios|联想电脑按什么键进bios设置U盘启动...
- 一篇ACSAC的关于ECC的论文分析
- 自动创建主背分离修片图层
- 怎么通过堡垒机创建虚拟服务器,怎么通过堡垒机连接云服务器
- qq游戏大厅2014 v3.4 官方正式版
- 谷歌浏览器Chrome的扩展程序安装目录