oracle视图索引优化

oracle视图索引优化数据库表设计不恰当往往是数据库性能表现低下的主要原因,其中索引设计不大是常见的问题。在进行数据库性能问题诊断时,应该重点关注索引的设计,以及SQL 语句的写法对索引的利用是否恰当。在适当的表字段建立索引,能有效加快查询速度,例如创建两个表:crea

oracle视图索引优化

数据库表设计不恰当往往是数据库性能表现低下的主要原因,其中索引设计不大是常见的问题。在进行数据库性能问题诊断时,应该重点关注索引的设计,以及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

|| ‘) ‘;

激活谷谷主为您准备了激活教程,为节约您的时间请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/15163.html

(0)
上一篇 2024年 5月 17日
下一篇 2024年 5月 17日

相关推荐

  • 二叉树查找原理_二叉树的查找算法

    二叉树查找原理_二叉树的查找算法什么是排序二叉树算法?详述排序二叉树算法的原理?用C语言实现排序二叉树算法。内附代码。大家好,我是贤弟!一、什么是排序二叉树?排序二叉树(binary search tree)是一种特殊的二叉树,它能够自动对插入的数据进行排序,同时也支持高效的查找、插入和删除操作。其原理是

    激活谷笔记 2024年 5月 30日
  • gpedit打不开怎么办_gpedit打不开 win10

    gpedit打不开怎么办_gpedit打不开 win10gpedit.msc打不开怎么办 gpedit.msc打不开解决办法【详解】许多用户在使用电脑的时候,都会使用到运行框输入gpedit.msc来打开本地组策略编辑器。但是最近不少用户在win+r输入gpedit.msc后却打不开本

    激活谷笔记 2024年 5月 24日
  • 校园新闻管理系统答辩稿_校园新闻管理系统答辩稿范文

    校园新闻管理系统答辩稿_校园新闻管理系统答辩稿范文大学毕业设计-校园新闻管理系统毕业论文设计校园新闻管理系统摘要:校园新闻管理工作是目前学习各项工作中的重点工作之一,如何能科学有效的开展新闻管理工作,是当前学校普遍关心的问题。新闻管理系统是学校进行信息交流的最直接的手段。学校结合自己的实际情况,建设一套“新闻管理系统”已经

    激活谷笔记 2024年 5月 24日
  • 哈希表和字典区别大吗为什么

    哈希表和字典区别大吗为什么你是否想过Python字典是如何快速与可靠的?答案是它们建立在另一种技术之上:哈希表。了解Python哈希表的工作方式将使你对Python字典的工作方式有更深入了解,这对于Python理解是一个很大的优势,因为字典在Python中几乎无处不在。哈希函数

    激活谷笔记 2024年 5月 17日
  • 指针和数组赋值的关系_指针和数组赋值的关系是什么

    指针和数组赋值的关系_指针和数组赋值的关系是什么最新腾讯面试题汇总C++后端开发岗(部分含答案)阻塞、非阻塞、同步、异步 的区别阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu 不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。对于同步调用来说,很多时候

    2024年 5月 24日
  • clear什么意思_clear什么意思英语天气

    clear什么意思_clear什么意思英语天气clear是什么意思_clear用英语怎么说_clear的翻译_clear翻译成_clear的中文意思_clear怎么读,clear的读音,clear的用法,clear的例句全部四级六级高考考研They choose purpose over happiness—having a cl

    激活谷笔记 2024年 5月 26日
  • malloc返回的是虚拟地址吗_malloc返回的是指针还是地址

    malloc返回的是虚拟地址吗_malloc返回的是指针还是地址C语言内存管理机制malloc/calloc/free原理与实现一、C程序的存储空间布局图1text:整个用户空间的最低地址部分,存放的是指令(程序所编译成的可执行机器码)。可共享,即使是频繁操作执行的程序,在存

    2024年 5月 24日
  • 系统接口设计图怎么做的图片_系统接口设计图怎么做的图片大全

    系统接口设计图怎么做的图片_系统接口设计图怎么做的图片大全APP开发详细流程APP总的开发流程可分为以下几个阶段,第一个阶段是需求分析阶段,第二阶段是UI设计阶段,第三阶段是系统设计阶段,第四阶段是开发编码阶段,第五阶段是测试调试阶段,第六阶段是上线发布阶段,第七阶段是运营维护阶段。每个阶段包括

    2024年 5月 25日
  • 单片机c语言和c语言的区别在哪里_单片机c语言和c语言的区别在哪里呢

    单片机c语言和c语言的区别在哪里_单片机c语言和c语言的区别在哪里呢基于单片机汽车防撞报警+自动刹车(全套Proteus仿真+原理图+程序+说明书)1. 功能基于51单片机汽车倒车防撞报警系设计:1、采用单片机+C语言进行设计,实现倒车测距报警功能。2、使用超声波实现倒车测距,如果距离过小进行声光报警。3、

    2024年 5月 21日
  • 与什么相似的英文?_与什么相似的英文短语

    与什么相似的英文?_与什么相似的英文短语垂体后叶细胞英文怎么写_垂体后叶细胞英语怎么说_例句focusing board是什么意思及反义词在线翻译网精选focusing board是什么意思、英语单词推荐聚焦板相似短语focusing boa

    2024年 5月 29日
  • linux串口助手_linux串口助手cutecom

    linux串口助手_linux串口助手cutecomLinux下使用可视化的串口调试工具cutecom转:https://www.cnblogs.com/xingboy/p/14388610.html在Ubuntu下想直接使用像Windows下串口调试助手一样的工具。之

    2024年 6月 2日
  • cd players的意思_cd player什么意思英语

    cd players的意思_cd player什么意思英语cd player是什么意思_cd player用英语怎么说_cd player的翻译_cd player翻译成_cd player的中文意思_cd player怎么读,cd player的读音,cd player的用法

    激活谷笔记 2024年 5月 22日
关注微信