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

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

mhr18 2024-09-18 20:20 20 浏览 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

|| ') ';

相关推荐

Docker安装详细步骤及相关环境安装配置

最近自己在虚拟机上搭建一个docker,将项目运行在虚拟机中。需要提前准备的工具,FinallShell(远程链接工具),VM(虚拟机-配置网络)、CentOS7(Linux操作系统-在虚拟机上安装)...

Linux下安装常用软件都有哪些?做了一个汇总列表,你看还缺啥?

1.安装列表MySQL5.7.11Java1.8ApacheMaven3.6+tomcat8.5gitRedisNginxpythondocker2.安装mysql1.拷贝mysql安装文件到...

Nginx安装和使用指南详细讲解(nginx1.20安装)

Nginx安装和使用指南安装1.检查并安装所需的依赖软件1).gcc:nginx编译依赖gcc环境安装命令:yuminstallgcc-c++2).pcre:(PerlCompatibleRe...

docker之安装部署Harbor(docker安装hacs)

在现代软件开发和部署环境中,Harbor作为一个企业级的容器镜像仓库,提供了高效、安全的镜像管理解决方案。通过Docker部署Harbor,可以轻松构建私有镜像仓库,满足企业对镜像存储、管理和安全性...

成功安装 Magento2.4.3最新版教程「技术干货」

外贸独立站设计公司xingbell.com经过多次的反复实验,最新版的magento2.4.3在oneinstack的环境下的详细安装教程如下:一.vps系统:LinuxCentOS7.7.19...

【Linux】——从0到1的学习,让你熟练掌握,带你玩转Linu

学习Linux并掌握Java环境配置及SpringBoot项目部署是一个系统化的过程,以下是从零开始的详细指南,帮助你逐步掌握这些技能。一、Linux基础入门1.安装Linux系统选择发行版:推荐...

cent6.5安装gitlab-ce最新版本-11.8.2并配置邮件服务

cent6.5安装gitlab-ce最新版本-11.8.2并配置邮件服务(yum选择的,时间不同,版本不同)如果对运维课程感兴趣,可以在b站上搜索我的账号:运维实战课程,可以关注我,学习更多免费的运...

时隔三月,参加2020秋招散招,终拿字节跳动后端开发意向书.

3个月前头条正式批笔试4道编程题只AC了2道,然后被刷了做了200多道还是太菜了,本来对字节不抱太大希望,毕竟后台竞争太大,而且字节招客户端开发比较多。后来看到有散招免笔试,抱着试一试的心态投了,然而...

Redisson:Java程序员手中的“魔法锁”

Redisson:Java程序员手中的“魔法锁”在这个万物互联的时代,分布式系统已经成为主流。然而,随着系统的扩展,共享资源的争夺成为了一个棘手的问题。就比如你想在淘宝“秒杀”一款商品,却发现抢的人太...

【线上故障复盘】RPC 线程池被打满,1024个线程居然不够用?

1.故障背景昨天晚上,我刚到家里打开公司群,就看见群里有人讨论:线上环境出现大量RPC请求报错,异常原因:被线程池拒绝。虽然异常量很大,但是异常服务非核心服务,属于系统旁路,服务于数据核对任务,即使...

小红书取消大小周,有人不高兴了!

小红书宣布五一节假日之后,取消大小周,恢复为正常的双休,乍一看工作时长变少,按道理来说大家应该都会很开心,毕竟上班时间缩短了,但是还是有一些小红书的朋友高兴不起来,心情很复杂。因为没有了大小周,以前...

延迟任务的多种实现方案(延迟机制)

场景订单超时自动取消:延迟任务典型的使用场景是订单超时自动取消。功能精确的时间控制:延时任务的时间控制要尽量准确。可靠性:延时任务的处理要是可靠的,确保所有任务最终都能被执行。这通常要求延时任务的方案...

百度java面试真题(java面试题下载)

1、SpingBoot也有定时任务?是什么注解?在SpringBoot中使用定时任务主要有两种不同的方式,一个就是使用Spring中的@Scheduled注解,另一个则是使用第三方框架Q...

回归基础:访问 Kubernetes Pod(concurrent.futures访问数据库)

Kubernetes是一头巨大的野兽。在它开始有用之前,您需要了解许多概念。在这里,学习几种访问集群外pod的方法。Kubernetes是一头巨大的野兽。在它开始有用之前,您需要了解许多不同的...

Spring 缓存神器 @Cacheable:3 分钟学会优化高频数据访问

在互联网应用中,高频数据查询(如商品详情、用户信息)往往成为性能瓶颈。每次请求都触发数据库查询,不仅增加服务器压力,还会导致响应延迟。Spring框架提供的@Cacheable注解,就像给方法加了一...

取消回复欢迎 发表评论: