先给来一张偷来的图
oracle 数据库和实例。
首先解释数据库和实例的区别。
可以这么理解
1.数据库就是实实在在存储数据的文件。
2.实例就是一些oracle进程,内存和加载到内存里的数据集合。
其实oracle sql编程语法就之前说的那么多,剩下的就是要看sql到底怎么执行了。知其然知其所以然。了解sql执行原理和一些内部机制才能指导我们写更优的sql。
实例=SGA(共享区)+后台进程+内存
那么有如下结论:
1.实例与SGA是一对一的关系
2.同一个实例的多个用户共享SGA
后台进程在分析SGA原理的时候会提到一些用得上的,内存就不用说了吧,那么SGA=数据库高速缓存(Database buffer cache)+共享池(shared pool)+重做日志缓存区(redo log buffer)+大型池(large pool)+java池(java pool)+流池(stream pool)+……
数据库高速缓存:用来存储三部分数据,还没有来得及写会数据库的数据,空块,正在使用的数据。根据箭头可知应该是dbw进程完成的。
重做日志缓存:保存了之前修改的数据原始记录用来回滚
共享池:包括两部分数据字典缓存和sql缓存,数据字典缓存缓存了数据库一些表,列,用户,权限,索引等信息。用来加快sql语句解析的速度。
数据库缓存缓存了一些sql语句和这些语句解析后的代码和执行计划。
正因为共享区的存在,所以sql语句会互相影响。从而影响执行效率
那么具体是怎么影响的呢,那就是数据库高速缓存中的软解析和硬解析对sql效率的影响