Oracle 学习总结 - 表和索引的性能优化
表的性能
表的性能取决于创建表之前所应用的数据库特性,数据库->表空间->表,创建数据库时确保为每个用户创建一个默认的永久表空间和临时表空间并使用本地管理,创建表空间设为本地管理并且自动段空间管理
本地管理表空间在每个数据文件中使用一个位图来管理对象扩展和空闲空间
查看数据库相关配置
SELECT * FROM DATABASE_PROPERTIES
SELECT * FROM V$PARAMETER
查看表空间相关配置
select* from DBA_TABLESPACES
主要表类型 | 描述及用法 |
堆组织表 | 一般默认类型 |
临时表 | 基于会话或事物期间的临时表,结束后销毁 |
索引组织表 | 按照主键排序的B+树索引结构中,提供快速读取 |
分区表 | 由多个相互分隔开的物理段组成的逻辑表 |
物化视图 | 包含sql查询结果的表,聚集数据以快速提供报表或复制数据 |
聚簇 | 共享相同存储的一组表,减少io |
提升表性能的建议,使用正确的数据类型,是数字就用数据,精度可以确定就指定精度,是日期就是使用日期类型,变长使用varchar2,当需要从Null更新到大值时适当调大pctfree防止过多的行链接影响数据块读取性能,主键索引等的合理设计,尽量减少lob的使用,如果都非空就设置not null
oracle 11gr2之后,将表及索引的物理空间分配延迟到第一条记录插入到表时,通过查询'user_segments'和'user_extents'验证
如果需要将大量数据加载到表中,如果数据非关键可轻易重建或者导入后立马备份,可以设置nologging使直接路径操作产生的重做日志最小化并使用直接路径加载
alter table *** nologging;
insert /*+append*/ into *** select * from xxx;
高效移除表中数据,truncate会将高水位线归零(全表扫描仅搜索高水位线之下的存储块中的数据行),释放空间(reuse storage),受外键约束/delete产生大量的撤销和重做日志,可回退,如果用drop重建,必须同时重建所有索引约束授权触发器等,并且在重建完成之前不可用
通过v$transaction查询事物细节
查看顾问运行的时间
select * from dba_auto_segadv_summary
生成的相关结果表
dba_advisor_findings
dba_advisor_objects
dba_advisor_executions
查看顾问段的建议的工具,是否有建议需要收缩,移动或压缩的表
select * from table(dbms_space.asa_recommendations('false','false','false'))
更新一行数据,当空余空间无法容纳数据,则当前数据块中存储指针,指向新的数据块,成为行链接,查询时需要访问多个数据块影响性能,需要Move,移动过程中会上锁。移动完后数据行会被分配新的rowid,所以需要重建索引等
alter table tt move /* pctfree 40 */;
alter index itt rebuild;
通过dba_indexs和user_tables等表可以验证
ROWID唯一标识一个数据行,但不同表中的数据行存储在同一个聚簇中可能会有相同的值
如果表太闲,闲置空间太多,需要收缩并调整高水位线,用占用最小存储空间的方式重新组织数据块并重新调整表的高水位线
alter table tt entable row movement;
alter table tt shrink space /*compact 不重新调整水位线*/ ;
数据表压缩,将数据表数据压缩在较少的数据块中,从而在接下来的过程中使用较少的io,还有很多付费的高级压缩方式
alter table tt compress;
//已存数据也
alter table tt move compress;
索引及性能优化
需要考虑什么:
正确添加索引,能提高查询速度,减少查询io,但会增加索引的存储空间,并且当数据修改时要对应修改索引,增加消耗。
索引的类型 | 用法 |
B树索引 | 高基数列使用,创建rowid和列值组成的条目,每个条目中rowid指向 |
B树聚簇索引 | 键物理排序放在一起 |
散列聚簇索引 | |
基于函数的索引 | 某个函数常常出现在where语句中,加这个 |
虚拟列索引 | |
反转键索引 | 按照序列插入某值,会导致某个索引块过热争用频繁,所以定义反转索引减少争用,但缺点是不支持范围搜索 |
键值压缩索引 | 某个索引前导列有大量重复值,定义压缩减少访问io |
位图索引 | 低基数列创建,适合基本不更新的,因为大面积锁表 |
位图连接索引 | 索引中包含where子句,将连接结果存储在索引中 |
全局分区索引 | 分区表各个分区一个全局索引 |
本地分区索引 | 分区表每个分区一个索引 |
为优化器提供最新的信息
exec dbms_stats.gather_table_stats(ownname=>'SYSTEM', tabname=>'TT',cascade=>true);
b树索引查询的集中情况:
create index itt on tt(id)
1. 查询所需要的所有表数据都包含在索引结构中
索引范围扫描:select id from tt where id=1; INDEX RANGE SCAN, consistent gets 只访问索引块即可获得数据
索引快速全扫描:select count(id) from tt where id=2; INDEX FAST FULL SCAN, consistent gets 仅全部访问索引即可得到结果
2. 查询需要的信息并非都包含在索引数据块中,因此查询需要访问索引和表,即需要回表
select id,name from tt where id=1; TABLE ACCESS BY INDEX ROWID/INDEX RANGE SCAN,consistent gets先访问索引找到对应的数据块,再通过rowid找到对应数据块读
3. 不访问索引,全表扫描
select * from tt; TABLE ACCESS FULL, consistent gets 都为数据块访问
需要建立索引的情况:
为每张表创建主键约束,自动为主键列创建索引,在需要保持唯一的非空列上创建唯一索引,将会在唯一键约束所声明的列上自动创建一个索引,在外键列上创建索引,where后出现频率高的
创建没有数据段的索引,永远不会使用并且永远不会为其分配盘区的索引,可以预先测试确定优化器是否会使用到它
alter session set "_use_nosegment_indexes"=true;
set autotrace trace explain;
/*查询看是否使用到索引*/
创建主键索引
alter table tt add constraint itt primary key (id)
查看当前某张表上的所有约束和索引
select * from user_constraints where table_name ='TT';
select * from user_indexes where table_name ='TT';
创建唯一索引
alter table tt add constraint utt unique (name)
创建外键索引
alter table tt1 add constraint agepk foreign key (id1) references tt(id)
组合索引在非前导情况,优化器选择INDEX SKIP SCAN也会用到索引
通过压缩处理在一个索引列中,某行具有大量重复值的情况,节省存储空间,在叶子数据块中存储更多的值,减少io的访问
create index ttt on tt1(age) compress 1 /* nocompress */
基于函数的索引
create index funt on tt(upper(name))
索引虚拟列
反转索引,使用序列来填充主键列,会导致索引资源争夺,因为值近似,导致对同一个数据块的多次插入,引起争夺。缺点是不支持范围扫描
create index rtt on tt(address) reverse
还可以新增一个不影响已有应用,优化器不可见 invisible,第三方应用不可见并且在删除之前设为不可见,确定不能删除再删除
对于星型架构的数据仓库,一张很大的事实表和一系列维度表组成,存储数据行的rowid和位图,适合低基数列,基本不会更新,因为会大面积锁表
位图连接索引将两张表的连接结果保存在索引中,避免了表连接,这种索引可以包含where 子句,适用于数据仓库,表加载后不会进行更新
索引组织表,将表中数据行的所有内容存储在一个B树索引中
Oracle 学习总结 - 表和索引的性能优化的更多相关文章
- Oracle多表连接效率,性能优化
Oracle多表连接,提高效率,性能优化 (转) 执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只 ...
- oracle学习之表空间
一.oracle当中的dual表 注意:sql语句一定要有一个 : 结尾,不然会报错. Oracle数据库内种特殊表DualDual表Oracle实际存表任何用户均读取用没目标表SelectDual表 ...
- MySQL索引及性能优化分析
一.SQL性能下降的原因 查询语句问题,各种连接.子查询 索引失效(单值索引.复合索引) 服务器调优及各个参数设置(缓冲.线程池等) 二.索引 排好序的快速查找数据结构 1. 索引分类 单值索引 一个 ...
- oracle学习----去除表中的重复数据
重复的数据可能有这样两种情况,第一种:表中只有某些字段一样,第二种:两行记录完全一样.第一.对于部分字段重复数据的删除 先来谈谈如何查询重复的数据吧. 下面语句可以查询出那 ...
- (一)Oracle学习笔记—— 表和表空间
1. 表空间 一个数据库可以有多个表空间,一个表空间里可以有多个表.表空间就是存多个表的物理空间:可以指定表空间的大小位置等. 1.1 创建表空间语句 create tablespace ts3 d ...
- mysql查询INFORMATION_SCHEMA表很慢的性能优化
最近发现,我们有些环境的tomcat应用启动非常缓慢,大部分在3-5分钟,有个测试环境更加阶段,要十几分钟才能启动完成.经过仔细分析,是一个查询INFORMATION_SCHEMA库中数据字典信息的查 ...
- Java基础学习总结(80)——Java性能优化详解
让Java应用程序运行是一回事,但让他们跑得快就是另外一回事了.在面对对象的环境中,性能问题就像来势凶猛的野兽.但JVM的复杂性将性能调整的复杂程度增加了一个级别.这里Refcard涵盖了JVM in ...
- SQL Server 内存优化表的索引设计
测试的版本:SQL Server 2017 内存优化表上可以创建哈希索引(Hash Index)和内存优化非聚集(NONCLUSTERED)索引,这两种类型的索引也是内存优化的,称作内存优化索引,和基 ...
- 深挖计算机基础:Linux性能优化学习笔记
参考极客时间专栏<Linux性能优化实战>学习笔记 一.CPU性能:13讲 Linux性能优化实战学习笔记:第二讲 Linux性能优化实战学习笔记:第三讲 Linux性能优化实战学习笔记: ...
随机推荐
- 学习笔记之Bokeh
Welcome to Bokeh — Bokeh 0.12.16 documentation https://bokeh.pydata.org/en/latest/ Bokeh is an inter ...
- php给app写接口进行接口的加密
<?php/**inc解析接口客户端接口传输规则:1.用cmd参数(base64)来动态调用不同的接口,接口地址统一为 http://a.lovexpp.com2.将要传过来的参数组成一个数组, ...
- (转)查询或修改iPhone的短信服务中心号码(iOS通用)
有些时候会有提示你自己的iPhone无法发送短信,原因是没有设置短信中心号码,下面就介绍一下如何设置iPhone的短信中心号码和iPhone查看短信中心号码的方法.(iOS通用) iPhone的设置短 ...
- mysql连接状态
mysql连接状态 mysqladmin -uroot -h127.0.0.1 status mysqladmin -uroot -h127.0.0.1 processlist
- Python 画3D图像
绘制一副3D图像 draw3D(X,Y,Z, angle) import numpy as np from matplotlib import pyplot as plt from mpl_toolk ...
- lock和Monitor(锁对象)
Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...
- C# 线程 在 sleep,suspend 之后 Abort 的方法
1) 线程在sleep时的Abort 方法:对线程函数用 catch ThreadAbortException ,并return. 示例: [csharp] view plaincopy ...
- courator - create
0. retry policy RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,3); 1. client 1) recipes ...
- Python三级菜单增删改查
#主要知识点是,字典,列表是使用menu = {'北京':{ '朝阳':{ '国贸':{ 'CICC':{}, 'HP':{}, '渣打银行':{}, 'CCTV':{} }, '望京':{ '陌陌' ...
- VMware扩展Linux根目录磁盘空间(Centos版本)
1.Centos 关机,选择编辑虚拟机设置,硬盘,在实用工具那里选择“扩展”,指定你需要的存储大小 2.启动客户机操作系统Centos,查看磁盘情况 输入指令 fdisk -l 显示结果如下 Disk ...