百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Oracle 性能分析与诊断|诊断与优化Oracle 索引

mhr18 2024-09-18 20:20 25 浏览 0 评论

数据库表设计不恰当往往是数据库性能表现低下的主要原因,其中索引设计不大是常见的问题。在进行数据库性能问题诊断时,应该重点关注索引的设计,以及SQL 语句的写法对索引的利用是否恰当。

在适当的表字段建立索引,能有效加快查询速度,例如创建两个表:

create table s1 as select * from SH.SALES;

create table s2 as select * from SH.SALES;

其中,s1 表没有建立索引,s2 表有建立索引。分别测试两个表的查询速度:

set timing on;

select * from s1 where prod_id=1;

2.45s

select * from s2 where prod_id=1;

0.59s

有建立索引的表比未建立索引的表查询速度要快很多,可见索引对于表查询速度的重要性。

另外,即使创建了索引,如果SQL 查询语句写法有问题,也会造成索引不能被利用的情况,例如,在Where 关键字后应该尽量避免使用函数,否则将抑制索引的使用,例如下面SQL 语句:

SELECT * FROM dwtable2 WHERE to_number(empno)=783;

Elapsed: 00:00:00.15

这个SQL 语句在Where 关键字后使用了不必要的to_number 函数,导致empno 这个字段上的索引不能被查询利用,这个SQL 语句可以改写成更高效率的写法:

SELECT * FROM dwtable2 WHERE empno=783;

Elapsed: 00:00:00.01

为了诊断数据库的索引设计,可利用下面的SQL 语句来查看Oracle 数据库index 信息:

SELECT A.OWNER, A.TABLE_OWNER, A.TABLE_NAME, A.INDEX_NAME, A.INDEX_TYPE,

B.COLUMN_POSITION, B.COLUMN_NAME, C.TABLESPACE_NAME,

A.TABLESPACE_NAME, A.UNIQUENESS

FROM DBA_INDEXES A, DBA_IND_COLUMNS B, DBA_TABLES C

WHERE A.OWNER = UPPER ('hr')

AND A.OWNER = B.INDEX_OWNER

AND A.OWNER = C.OWNER

AND A.TABLE_NAME LIKE UPPER ('DEPARTMENTS')

AND A.TABLE_NAME = B.TABLE_NAME

AND A.TABLE_NAME = C.TABLE_NAME

AND A.INDEX_NAME = B.INDEX_NAME

ORDER BY A.OWNER, A.TABLE_OWNER, A.TABLE_NAME, A.INDEX_NAME,

B.COLUMN_POSITION

还可以用下面的SQL 语句直接查出某个库中没有建立index 的表,分析是否有必要补充建立索引:

SELECT OWNER, TABLE_NAME

FROM ALL_TABLES

WHERE OWNER NOT IN ('SYS','SYSTEM','OUTLN','DBSNMP')

AND OWNER = UPPER ('scott')

MINUS

SELECT OWNER, TABLE_NAME

FROM ALL_INDEXES

WHERE OWNER NOT IN ('SYS','SYSTEM','OUTLN','DBSNMP')

一个表可以有几百个索引,但是对于频繁插入和更新表,索引越多系统CPU,I/O 负担就越重;建议每张表不超过5 个索引。可用以下SQL 语句查出建立了过量index 的表:

SELECT OWNER, TABLE_NAME, COUNT (*) "count"

FROM ALL_INDEXES

WHERE OWNER NOT IN ('SYS','SYSTEM','OUTLN','DBSNMP')

AND OWNER = UPPER ('hr')

GROUP BY OWNER, TABLE_NAME

HAVING COUNT (*) > ('4')

为了验证过量索引对性能的影响,读者可进行如下实验。

(1)创建两个表:

create table table1 as select * from SH.SALES;

create table table2 as select * from SH.SALES;

其中,table1 只在prod_id 列建索引,table2 在所有列建索引。

(2)分别更新两个表的相同prod_id 的数据,共29282 条数据:

SELECT count(*) FROM table1 where prod_id=30;

29282

(3)对比更新的速度:

set timing on;

update table1 set cust_id=1 where prod_id=30;

10.56s

update table2 set cust_id=1 where prod_id=30;

11.35s

可见过量的索引对于做更新操作的SQL 语句而言,会造成执行效率下降的情况,如果要更新的数据量比较大的话,效率的影响会更加明显。

对于一个SQL 语句的执行,如果没有可利用的索引,Oracle 将进行全表扫描,这将对性能造成比较大的影响,尤其是大数据量的全表扫描,效率是非常低下的,因此在性能测试和诊断分析过程中,寻找发生了全表扫描的Sid 和SQL 就尤为关键,下面的SQL 语句可以从v$sysstat

视图中找出有多少全表扫描在进行:

SELECT name, value

FROM v$sysstat

WHERE name LIKE '%table %'

ORDER BY name;

下面的SQL 语句将找出正在做全表扫描的Session:

SELECT ss.username

|| '('

|| se.sid

|| ') ' "User Process",

SUM (DECODE (NAME, 'table scans (short tables)', VALUE)) "Short Scans",

SUM (DECODE (NAME, 'table scans (long tables)', VALUE)) "Long Scans",

SUM (DECODE (NAME, 'table scan rows gotten', VALUE)) "Rows Retrieved"

FROM v$session ss, v$sesstat se, v$statname sn

WHERE se.statistic# = sn.statistic#

AND ( NAME LIKE '%table scans (short tables)%'

OR NAME LIKE '%table scans (long tables)%'

OR NAME LIKE '%table scan rows gotten%'

)

AND se.sid = ss.sid

AND ss.username IS NOT NULL

GROUP BY ss.username

|| '('

|| se.sid

|| ') ';

相关推荐

Java面试宝典之问答系列(java面试回答)

以下内容,由兆隆IT云学院就业部根据多年成功就业服务经验提供:1.写出从数据库表Custom中查询No、Name、Num1、Num2并将Name以姓名显示、计算出的和以总和显示的SQL。SELECT...

ADG (Active Data Guard) 数据容灾架构下,如何配置 Druid 连接池?

如上图的数据容灾架构下,上层应用如果使用Druid连接池,应该如何配置,才能在数据库集群节点切换甚至主备数据中心站点切换的情况下,上层应用不需要变动(无需修改配置也无需重启);即数据库节点宕机/...

SpringBoot多数据源dynamic-datasource快速入门

一、简介dynamic-datasourc是一个基于SpringBoot的快速集成多数据源的启动器,其主要特性如下:支持数据源分组,适用于多种场景纯粹多库读写分离一主多从混合模式。支持...

SpringBoot项目快速开发框架JeecgBoot——项目简介及系统架构!

项目简介及系统架构JeecgBoot是一款基于SpringBoot的开发平台,它采用前后端分离架构,集成的框架有SpringBoot2.x、SpringCloud、AntDesignof...

常见文件系统格式有哪些(文件系统类型有哪几种)

PART.01常见文件系统格式有哪些常见的文件系统格式有很多,通常根据使用场景(Windows、Linux、macOS、移动设备、U盘、硬盘等)有所不同。以下是一些主流和常见的文件系统格式及其特点:一...

Oracle MySQL Operator部署集群(oracle mysql group by)

以下是使用OracleMySQLOperator部署MySQL集群的完整流程及关键注意事项:一、部署前准备安装MySQLOperator通过Helm安装Operator到Ku...

LibreOffice加入"转向Linux"运动

LibreOffice项目正准备削减部分Windows支持,并鼓励用户切换到Linux系统。自Oracle放弃OpenOffice后,支持和指导LibreOffice开发的文档基金会对未来有着明确的观...

Oracle Linux 10发布:UEK 8.1、后量子加密、增强开发工具等

IT之家6月28日消息,科技媒体linuxiac昨日(6月27日)发布博文,报道称OracleLinux10正式发布,完全二进制兼容(binarycompatibility...

【mykit-data】 数据库同步工具(数据库同步工具 开源)

项目介绍支持插件化、可视化的数据异构中间件,支持的数据异构方式如下MySQL<——>MySQL(增量、全量)MySQL<——>Oracle(增量、全量)Oracle...

oracle关于xml的解析(oracle读取xml节点的属性值)

有时需要在存储过程中处理xml,oracle提供了相应的函数来进行处理,xmltype以及相关的函数。废话少说,上代码:selectxmltype(SIConfirmOutput).extract...

如何利用DBSync实现数据库同步(通过dblink同步数据库)

DBSync是一款通用型的数据库同步软件,能侦测数据表之间的差异,能实时同步差异数据,从而使双方始终保持一致。支持各种数据库,支持异构同步、增量同步,且提供永久免费版。本文介绍其功能特点及大致用法,供...

MYSQL存储引擎InnoDB(八十):InnoDB静态数据加密

InnoDB支持独立表空间、通用表空间、mysql系统表空间、重做日志和撤消日志的静态数据加密。从MySQL8.0.16开始,还支持为模式和通用表空间设置加密默认值,这允许DBA控制在这些模...

JDK高版本特性总结与ZGC实践(jdk高版本兼容低版本吗)

美团信息安全技术团队核心服务升级JDK17后,性能与稳定性大幅提升,机器成本降低了10%。高版本JDK与ZGC技术令人惊艳,且JavaAISDK最低支持JDK17。本文总结了JDK17的主要...

4 种 MySQL 同步 ES 方案,yyds!(两个mysql数据库自动同步的方法)

本文会先讲述数据同步的4种方案,并给出常用数据迁移工具,干货满满!不BB,上文章目录:1.前言在实际项目开发中,我们经常将MySQL作为业务数据库,ES作为查询数据库,用来实现读写分离,...

计算机Java培训课程包含哪些内容?其实就这六大块

不知不觉秋天已至,如果你还处于就业迷茫期,不如来学习Java。对于非科班小白来说,Java培训会更适合你。提前了解下计算机Java培训课程内容,会有助于你后续学习。下面,我就从六个部分为大家详细介绍...

取消回复欢迎 发表评论: