oracle 将内存分为 系统全局内存区域SGA 进程全局内存区域PGA两个区域
今天看了 SGA的两个区域,1库高速缓存 2数据库高速缓存
1库高速缓存
oracle账号前者是存放解析后的sql语句—语句解析的时候应当考虑到解析后的代码复用性,解析的时候源编码少许不同会导致重新解析,所以要多运用变量,让语句统一。
2数据库高速缓存
后者是存放从硬盘中读取出来的数据库块信息,如果代码被多次执行,存取的数据也就会多次复用,就能提高执行效率,减少物理存取,增加逻辑存取。
在真正的运行对比中
语句解析过,数据库高速缓存有内容的 执行速度 >>>远远大于>>>> 没有解析过需要物理存取的语句。 如果清空了高速缓存里面的内容 会增加物理读取数据库的时间。
在oracle中会对语句进行优化。
常用的方式就是查询转换
通过以下方式执行
视图合并 —将from后的子查询试图 中的表与外表合并
子查询解嵌套 —将where后的子查询中的表与外表合并
谓语前推 —将外查询的谓语(条件)放入到内查询中,减少了查询的量 (对于这个我不是很理解,这样不是会改变自己查询的结果么。望大神回复)
物化视图查询重写 —物化视图就是将视图查询保存下来,以后进行相同查询调用试图就好了。
这里有个小知识点,在sql中用了rownum这个参数后,会导致试图合并和谓语前推失效,相当于加入了hint NO_MERGE NO_PUSH_PRED
在执行的时候要注意一些细节, 选择比就是很重要的一个方面
select × from car_purchases where manufacturer = 'ford' and make = 'focus'
这里有1,000,000条信息 有4个厂商,1000个产品,
选择的时候就是1/4*1/1000 = 0.00025
而一个产品一般只有一个厂家生产
这样改变一下select × from car_purchases where make = 'focus'
选择比就变成了0.001
将大大影响语句的执行效率。
最后一个点就是网络传输方面
如果数据量大的话,提高单次发送的大小也很大程度上影响到了数据库的执行效率。
欢迎大神提出见解一起探讨。