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