ORACLE_第1张图片

oracle物理体系结构图如上:

PGA——>SGA+进程——>数据库

一、select object_name from t where object_id=29(执行过程分析)

1、在PGA(发起用户使用的私有内存空间)中检查是否有该查询的用户连接和权限信息,如果有,则直接使用,不用去硬盘中读取。此外若能放下排序规则,此处也可以进行排序

2、在共享池查询什么地方有存储过这个sql指令的***(唯一的hash值),如果没有,先检查该语句的语法语义等,如果没问题,生成它的唯一hash值,存储下来

3、解析:eg:用全表扫描还是索引,哪个更高效,决定后该执行计划存储下来,并和生成的hash值组成一对

4、去数据缓冲区拿数据,如果没拿到,去数据库的数据文件中拿数,返回给数据缓冲区

二、执行计划
结果中出现的主要属性:recurslve calls:递归调用   consistent gets:逻辑读  physical reads:物理读。但看性能主要还是得看cost和时间


三、update t set objec_id=92 where object_id=29

1、2、3、4和上面一样,

5、先做好镜像到回滚文件,以便rollcack,在缓冲区修改数据,commit后不一定及时写到数据库,是通过DBWR进程写入数据库(CKPT适时调    用DBWR进程)

6、日志缓冲区保存了数据库相关操作的日志,在commit时,LGWR进程先把日志缓冲区记录的日志写入磁盘的日志文件,以便redo

7、日志文件循环写入,如果满了,先备份成归档文件arch再去写,此外,arch文件也需要定时转移到新的存储介质

四、一致性读

SCN:system change number

oracle在做一致读时,首先看发起的SCN是否大于当前查询块的SCN,如果小于,毫无疑问从回滚段获取镜像数据,如果SCN大于当前查询块的SCN,还要确保该块没有活动事务,否则还要去镜像查找。


五、提升速度

1、绑定变量:eg:循环插入数据时,共享池编译一次即可


六、逻辑体系结构

数据库(database)包含多个表空间(tablespace),一个表空间包含多个段(segment),一个段包含多个区(extent),一个区包含多个块(block).

eg:在一片草原上,财主出租土地给老黄、老刘、老李等用于养动物,比如猪羊兔子等。

一般而言,一张表是一个段,但并不是绝对的,例如表包含lob类型列,那么lob至少会有两个段,数据段和索引段,如表有分区,则每个分区又都独立成段。

表空间大概分类:系统表空间、临时表空间、回滚表空间、数据表空间。

pctfree:block属性,调整pctfree设置block预留空间大小,eg:男生宿舍住人的问题

七、表分类

普通表、全局临时表、分区表(独立的逻辑表,但是底层由多个物理子表实现。分库分表是在应用层做的,而分区表是数据库自身做的,原理一样)、索引组织表、簇表

普通表的缺陷:

1、无论删除、插入还是修改,都会产生日志(用于redo,但在不需要日志的情况下是缺陷)

2、delete开销大,无法释放空间

3、表记录太大检索较慢:一张表其实是一个段,一般情况下,需要遍历段的所有block完成,如何提升呢?缩短访问路径即访问的block个数越少越好。两种技术:索引技术、分区表。

分区表:eg:原本一个表根据年月拆成12个小表即小段。

索引技术:当建立一张表时,产生一个表segment,在表列上建索引,产生一个索引segment。

八、索引和全表扫描(可以一次扫多个block)

1、索引树的高度一般比较低(根、茎、叶子),根和茎存储的是叶子的引用

2、索引(叶子)由索引列存储的值及rowid组成,而且值不能是null,否则有函数用不上索引(eg:count)

3、索引本身是有序的,可以用来消除order by 带来的性能问题

4、索引上存储的值列可以重复(自己总结)

当查询出的数据量很大时,效率有可能不如全表扫描。因为查询出结果需要读取block,读取一次是一次IO,结果过多就会有过多IO

eg:select * from t where t.id=1 (假设查询出很多结果)


4、count(*),sum、avg、max、min、upper等函数的索引问题

九、排序问题(能否通过索引降低排序带来的性能问题)

1、distinct

2、union all

十、索引个数问题

1、如果表建了索引,在插入的时候,因为要维护一份索引,所以插入会很慢。可以考虑插入完全后,再建立索引

十一、位图索引

适宜场景:索引列重复值比较多,并且不经常更新

十二、hint:强制执行

十三、连接

select * from t1,t2 where t1.id = t2.t1_id(前提条件,它俩之间存在这个关系)

执行顺序,先访问一次t1,查出所有数据,然后用第一条数据,访问t2关联,用第二条数据,访问t2关联...........

(另外,数据最少的表做驱动表,效率更高)

十四:AWR

是oracle 10g下提供的一种性能收集和分析工具,它能提供一个时间段内整个系统资源使用情况的报告,通过这个报告,我们就可以了解一个系统的整个运行情况,这就像一个人全面的体检报告。

十五:exp/imp:导入导出小型数据

     expdp/impdp:导入导出大型数据

十六、同义词

十七、

1、set autotrace on:跟踪sql的执行计划和执行的统计信息

2、set timing on:设置打开sql执行所用时间

十八、表建索引是会产生锁,直到建完后才释放,因为只有加上锁,排序动作才可以完成。但是最好不要在业务高峰期去建索引,因为有可能会产生锁等待

十九、

Parallel 强行启用并行度来执行当前SQL