count数据库优化oracle,迷惑性SQL性能问题排查与优化

:数据科学、人工智能从业者的在线大学。数据科学(Python/R/Julia)数据分析、机器学习、深度学习

作者简介

戴秋龙,拥有超过八年的电信、保险、税务行业核心系统ORACLE数据库优化,优化经验,具备丰富的行业服务背景。对Oracle数据库有深刻的理解,擅长数据库故障诊断,数据库性能调优。

背景:

客户某SQL,逻辑读比较高。需要优化。也给出了AWR报告,AWR报告中主要几个SQL都是类似的问题。

SQL_ID: g4nbv7twn23fw, 成本:3000 逻辑读/次 40万次/h

SELECT * FROM (SELECT XX.*, ROWNUM AS RN FROM (select count(*) from PARTY_CERT P inner join CUSTOMER C on P.PARTY_ID = C.PARTY_ID and C.STATUS_CD = '1100' where P.PARTY_ID in (:1 ) and P.STATUS_CD in (:2 ) and P.IS_DEFAULT = '1') XX WHERE ROWNUM <= 1000 ) XXX WHERE RN > 0

分析:

查询出绑定变量的值带入SQL,发现只有9个逻辑读。与AWR报告不符合

1713e51aa992b67d970ad7bdec4a4d01.png

可能有读者认为性能问题在ID=5笛卡尔积问题,但从事后看问题不在这里。此时陷入僵局。但ASH视图中或许能给出线索。

1fc5f6709ea963f0a2c3e49425541b14.png

通过ash分析,更多的性能消耗在执行计划的第9步。也就在C表(CUSTOMER)的回表上。

SQL中得出C表用到两个字段 C.PARTY_ID,C.STATUS_CD。PARTY_ID上建有索引,回表就是为了访问STATUS_CD字段。

因此建议建立索引index C ( PARTY_ID, STATUS_CD ); 这样可以避免回表。

针对该SQL的优化建议是建立索引。

实施组建立索引后,从后期多份AWR报告中,该SQL平均330逻辑读/次。

思考能否继续优化

未优化之前带入绑定变量9逻辑读但AWR报告中平均3000逻辑读。结合起来看是否是数据分布不均衡导致呢?

排查中发现C表 PARTY_ID字段的选择性 98%,结合绑定变量继续排查。

4228b422dfa602b605fb5ba922c17cf3.png

如图:就是一个值在表中有10万,其他值在表中只有1条。

当PARTY_ID = 15151723602037,回表需要回10万次。把该值带入SQL中。逻辑读7770/次。是它把平均逻辑读拉到3000.针对该问题上文已经有相关建议。那能否进一步优化?

探讨:以下探讨在没有建立新索引的基础上

既然数据分布不均衡,是否可以通过收集直方图来改善性能?答案是否定的。

做好测试环境。

( 建立测试表:CUSTOMER_test。导入全部数据,建立相关索引,收集直方图 ) 执行SQL,SQL效率更差,15万逻辑读/次

fc9af69a30dcf7ffe70ba753838bd216.png

5a701e5aa347f65949137b9ae7c1ba1e.png

回到SQL中。分析SQL,SQL只是需要count(1),统计类型的,可以考虑用半连接

需要和业务确认是否可以改成半连接。( 此处不讨论业务,只讨论这种数据分布情况下如何优化 )因为针对数据分布不均衡半连接效果比较好。

改写SQL:( 带入数据最多的值 )

SELECT * FROM (SELECT XX.*, ROWNUM AS RN FROM (select count(1)

from CUST_YC_APP.PARTY_CERT P where P.PARTY_ID in (15151723602037)

And P.PARTY_ID in( select C.PARTY_ID from CUSTOMER_test C

where C.STATUS_CD = '1100' ) and P.STATUS_CD in ('1000')

and P.IS_DEFAULT = '1') XX WHERE ROWNUM <= 1000) XXX WHERE RN > 0;

改成in后不添加hints就会走全表,1286逻辑读/S

添加hint/*+ nl_sj index(c) */9逻辑读/次

SQL无法自动走最佳的执行计划,需要绑定hints才走。

如何自动用最佳执行计划呢?

删除直方图。

删除直方图后P.PARTY_ID in (15151723602037)的数据量虽然很多但CBO评估该数据量1条,直接走了hash join ( 有时候也会结合 C.PARTY_ID = P.PARTY_ID评估出 C.PARTY_ID =15151723602037 也是1条,直接走笛卡尔积关联,类似开头的问题)。而不是最好的执行计划。

收集直方图,会走索引,删除直方图会走hash/笛卡尔积关联.就是得不到半连接

似乎陷入了困境。

设置数据选择性。

帮助CBO评估 P表返回的数据,其对精确度要求也不高,甚至只要多评估几条,让CBO倾向选择走半连接即可。

DBMS_STATS.set_column_stats(colname =>'PARTY_ID',distcnt => 1645919);

1645919 大约数据总量的30%,

测试SQL,看SQL是不是直接选择最好的执行计划。

执行计划果然是nested_loop seml 关联并且走索引。就是目前探讨的最好的执行计划。9逻辑读/次

b1d74da53c1e1361b9f8e039489dd639.png

总结:

分析并且优化该SQL,有注意的地方有6点

笛卡尔积关联,并不是性能瓶颈。

数据特殊分布,数据集中在某个值,这个值带来严重的索引再回表。

结合数据分布把SQL改成半连接形式,成本明显减少。

由于特殊分布,收集直方图当测试特殊分布的值时候会带来大表全表扫描,不收集直方图会带来hash join 不是我们想要得到的 nested_loop seml。

设置统计信息既能固定走索引扫描,(无论此表中数据情况都是索引扫描效率最高),又能满足最好的关联方式nested_loop seml。

最终的实施优化方案采用最简单直接的方案,而不是我们文中探究的改SQL,设置统计信息等。而且最终效果还不错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python getopt参数参数自动补全_如何在Python中使用getopt / OPTARG?如果给出过多的参数(9),如何转移参数?...

How to use getopt/optarg in Python?解决方案This is an example of how I do it, I usually use the same basic template:import sysimport getopttry:opts, args getopt.getopt(sys.argv[1:], m:p:h, [miner, params, help])except getopt.GetoptError:usage()sys.exit(2…

python读取数据库数据类型_Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】...

本文实例讲述了Python实现从SQL型数据库读写dataframe型数据的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; Python的pandas包对表格化的数据处理能力很强&#xff0c;而SQL数据库的数据就是以表格的形式储存&#xff0c;因此经常将sql数据库里的数据直接读取为…

oracle客户端三种连接,客户端连接ORACLE的几种方法

一、HOSTNAME方法对于网络结构比较单一&#xff0c;Oracle服务器比较少的情况下&#xff0c;可以使用HOSTNAME方法。不过这种方法有几个限制&#xff1a;1、 必须使用TCP/IP协议2、 不能使用高级管理工具&#xff0c;比如Oracle Connection Manager3、 客户端必须有相应的扩展命…

swiper.js pagination指示点不变_电缆故障点的四种实用测定方法

一、电缆故障的种类与判断无论是高压电缆或低压电缆&#xff0c;在施工安装、运行过程中经常因短路、过负荷运行、绝缘老化或外力作用等原因造成故障。电缆故障可概括为接地、短路、断线三类&#xff0c;其故障类型主要有以下几方面&#xff1a;①三芯电缆一芯或两芯接地。②二…

oracle undo段的作用,Oracle数据库中Undo数据段的作用及类型

Undo数据段的作用&#xff1a;事务回滚(Transaction Rollback)&#xff1a;程序执行rollback操作。事务修复(Transaction Recovery)&#xff1a;rollback是recovery的一部分。读取一致(Read Consistency)&#xff1a;根据SCN(system change number)来保证读取数据的一致性。Und…

wampserver php扩展openssl 不可用_PHP基础及WAMP集成基础

PHP语言编写的基础框架 PHP语言的编写框架与HTML5的一致&#xff0c;都是一下框架&#xff1a;<!DOCTYPE html> <html><head></head><body> </body> </html>PHP的主要表达语句在body里面&#xff0c;主题内容在<?p ?>标签中…

python expect模块_Python尚学堂高淇|第二季0408P119P123with上常见的异常的解决tryexcept...else结构,...

P119 04&#xff1a;try ...except...else结构try..except...else结构增加了"else快"如果try快当中没有抛出异常&#xff0c;则执行else快&#xff0c;如果try快当中抛出异常&#xff0c;则执行except快&#xff0c;不执行【实例】try....except...else结构执行测试…

oracle 31693,ORACLE expdp备份与ORA-31693、ORA-02354、ORA-01555

近期&#xff0c;某综合网管系统expdp备份出现异常&#xff0c;报错信息如下&#xff1a;Export: Release 10.2.0.4.0 - 64bit Production on 星期二, 12 4月, 2016 11:30:00Copyright (c) 2003, 2007, Oracle. All rights reserved.;;;连接到: Oracle Database 10g Enterpris…

用c语言简单办法做一个字典_幼儿园手工,用废纸筒做一个简单的小蝴蝶,有教程...

幼儿园的手工&#xff0c;除了用卡纸做各种简单的小制作外&#xff0c;纸筒也是常用的手工材料。下面用纸筒做一个简单的小蝴蝶&#xff0c;做法很简单。制作过程&#xff1a;准备材料废纸筒、剪刀、胶、水彩笔&#xff0c;纸板。在纸筒上剪下五个圈圈剪完的样子见下图把里面粘…

bing搜索引擎入口_互联网流量入口——头条的搜索计划

互联网时代&#xff0c;谁掌控了用户流量&#xff0c;那它就基本上胜出了一半&#xff1a;只有大量的用户和海量的数据才是信息化时代的主要要素。这些大数据信息和火热的深度学习算法的结合&#xff0c;能够催生无数的应用场景&#xff0c;通过不断的扩展和调整业务来保证自身…

jvm oracle sun,JVM - 常见的JVM种类

HotSpot VMHotSpot VM是绝对的主流。大家用它的时候很可能就没想过还有别的选择&#xff0c;或者是为了迁就依赖了Oracle/Sun JDK某些具体实现的烂代码而选择用HotSpot VM省点心。Oracle / Sun JDK、OpenJDK的各种变种(例如IcedTea、Zulu)&#xff0c;用的都是相同核心的HotSpo…

python单链表实现具体例子_Python实现数据结构线性链表(单链表)算法示例

本文实例讲述了Python实现数据结构线性链表&#xff08;单链表&#xff09;算法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 初学python&#xff0c;拿数据结构中的线性链表存储结构练练手&#xff0c;理论比较简单&#xff0c;直接上代码。 #!/usr/bin/python # …

oracle conneciton properties,在WAS Liberty连接池中,我可以验证借用连接吗?

我们当前正在将应用程序迁移到Liberty服务器(8.5.5.9)上运行。我们发现应用程序服务器和数据库之间的连接偶尔会被防火墙终止&#xff0c;因为它们会在很长一段时间内处于空闲状态。发生这种情况时&#xff0c;在下一个HTTP请求中&#xff0c;应用程序将收到其中一个断开的连接…

python图形化编程工具哪个好_mPython(图形化编程软件) V0.5.0 官方版

mPython 是一款针对Python 3编程语言的图形化编辑工具。支持函数&#xff0c;仿真、hex、python、blockly三种代码读写等功能。并可以与TPYBoard系类开发板配合使用&#xff0c;直接连接PC端进行编程。【功能特点】 1、不依赖网络&#xff0c;可离线安装使用 2、支持hex、pytho…

python三种变量方式_python2.x 3种变量形式调用

python 变量使用raw_input 2.x input 3.x第一种name input("name:")age input("age:")job input("job:")info ----------info - %s ----------Name: %sAge: %sJob: %s% (name,name,age,job)print (info)第二种name input("name:"…

linux更新系统内核,如何更新Linux内核来提升系统性能?

Linux内核的开发速度是前所未有的&#xff0c;大概每二三个月就会有一个新的主要版本发布。每次发布都带来了几项新的功能和改进&#xff0c;许多人可以充分利用它们&#xff0c;让计算体验更快、更高效或者有其他方面的提升。可问题是&#xff0c;你通常无法充分利用这些刚发布…

php对接V免签支付教程_【全网首发】最新版影视小程序搭建教程完整版

大家好&#xff0c;这里是深海网络&#xff0c;今天给大家讲解一下新版影视小程序搭建。  首先给大家看一下新版影视小程序是什么样子的&#xff0c;它有黑夜和白天两种观影模式&#xff0c;而且搜索精准&#xff0c;播放速度快。01第一步&#xff0c;开始正式搭建。新版区小…

linux编译代码命令,Linux下使用GCC命令编译代码

Linux下初学时最好从命令行入手&#xff0c;这样可以熟悉从编写程序、编译、调试和执行的整个过程。编写程序可以用vi/vim(个人觉得vim比vi好用)或其它编辑器编写。编译则使用gcc命令。要往下学习首先就得熟悉gcc命令的用法。gcc命令提供了非常多的命令选项&#xff0c;但并不是…

简要描述内部连接和外部连接之间的区别_sqlserver的几种常见连接方法

感谢本文几种描述方法&#xff0c;让我解决了最近的一段时间的疑问&#xff0c;转载下来&#xff0c;以供后面查血使用。本文链接&#xff1a;https://blog.csdn.net/huanghanqian/article/details/52847835四种join的区别已老生常谈&#xff1a;INNER JOIN(也可简写为JOIN): 如…

有两个python怎么停用其中一_python3.X 复学(2)-----开始了就不要停止

生命就是一种旅行&#xff0c;开始了就不要停止&#xff0c;无非就是眼前的苟且还有以后的苟且&#xff0c;只要还有一口气 ----------hashlinux 因为Python是跨平台的&#xff0c;它可以运行在Windows、Mac和各种Linux/Unix系统上。在Windows上写Python程序&#xff0c;放到Li…