Oracle SQL语句执行步骤

OracleSQL语句执行过程中,Oracle内部解析原理如下:

1、当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法、表名、字段名等相关信息(如下图),这过程会花比较长的时间,因为它要分析语句的语法与语义。然后获得最优化后的执行计划(sql plan),并在内存中分配一定的空间保存该语句与对应的执行计划等信息。

2、当用户第二次请求或多次请求时,Oracle会自动找到先前的语句与执行计划,而不会进行Hard parse,而是直接进行Soft parse(把语句对应的执行计划调出,然后执行),从而减少数据库的分析时间。

注意的是:Oracle中只能完全相同的语句,包大小写、空格、换行都要求一样时,才会重复使用以前的分析结果与执行计划。

分析过程如下图:

clip_image001

对于大量的、频繁访问的SQL语句,如果不采用Bind 变量的方式,哪Oracle会花费大量的Shared latchCPU在做Hard parse处理,所以,要尽量提高语句的重用率,减少语句的分析时间,通过了解Oracle SQL语句的分析过程可以明白Oracle的内部处理逻辑,并在设计与实现上避免。

在用JDBC或其它持久化数据(Hibernate,JDO)操作时,尽量用占位符(?)

  

ORACLE sql 的处理过程大致如下:
1.
运用HASH算法,得到一个HASH值,这个值可以通过V$SQLAREA.HASH_VALUE 查看
2.
shared pool 中的 library cache 中查找是否有相同的HASH值,如果存在,则无需硬解析,进行软解析
3.
如果shared pool不存在此HASH值,则进行语法检查,查看是否有语法错误
4.
如果没有语法错误,就进行语义检查,检查该SQL引用的对象是否存在,该用户是否具有访问该对象的权限
5.
如果没有语义错误,对该SQL进行解析,生成解析树,执行计划
6.
生成ORACLE能运行的二进制代码,运行该代码并且返回结果给用户
硬解析和软解析都在第5步进行
硬解析通常是昂贵的操作,大约占整个SQL执行的70%左右的时间,硬解析会生成执行树,执行计划,等等。
当再次执行同一条SQL语句的时候,由于发现library cache中有相同的HASH值,这个时候不会硬解析,而会软解析,
那么软解析究竟是干了什么呢?其实软解析就是跳过了生成解析树,生成执行计划这个耗时又耗CPU的操作,直接利用生成的执行计划运行
SQL语句。
下面摘抄eygle深入解析ORACLE 中关于SQL执行过程的描述
  1.
首先获得library cache latch,根据SQLHASH_VALUElibrary cache中查找是否存在此HASH_VALUE,如果找到这个HASH_VALUE,称之为软解析,Server获得改SQL执行计划转向第4步,如果找不到共享代码就进行硬解析。
  2.
释放library pool cache,获得shared pool latch,查找并锁定自由空间(bucket 中查找chunk)。如果找不到,报ORA-04031错误
  3.
释放shared pool latch,重新获得library cache latch,SQL执行计划放入library cache中。
  4.
释放library cache latch,保持null模式的library cache pin/lock.
  5.
开始执行。
Library cache latch
可以理解为硬/软解析的时候发生的,因为解析的时候会搜索library cache,所以会产生library cache latch
Library cache pin
是在执行的阶段发生的。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字节流及字节对齐

#include #pragma pack(push,4) struct MyStruct { unsigned char a;// unsigned int b; //到这里是,加起来等于unsigned int 字节的倍数 unsigned char Cbuffer[10];//char没有字节对齐 unsigned int d; }; #pragma pack() void EnCodePack(unsigned char*cSend…

Android平台各类恶意软件及病毒概览

原文请见:http://mobile.51cto.com/ahot-364267.htmAndroid平台中各类恶意软件及病毒概览<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />随着移动互联网的发展&#xff0c;作为当今最大的移动操作系统之一&#xff0c;Android已…

string封装

class String { public: String(const char*str NULL) { if (str NULL) { data_ new char[1]; data_[0] 0; //memset(data_, 0, sizeof(data_)); //数组越界&#xff0c;delete的时候&#xff0c;会影响内存回收变化&#xff0c;因此会导致程序崩溃 } else { data_ new ch…

vim高级技巧(split)_小花_新浪博客

vim高级技巧&#xff08;split&#xff09;_小花_新浪博客:res(ize) N 把当前窗口高度增加N个像素 :res(ize) -N 把当前窗口高度减少N个像素 :vertical res(ize) N 把当前窗口宽度增加N个像素 :vertical res(ize) -N 把当前窗口宽度减少N个像素等于是按下后,松开键盘,再按…

单链表反转和插入

#include struct node { int value -1; node* next_ptr nullptr; }; //创建结点 void create(int i, node** header_ptr) { node* current header_ptr; //第一个结点 if (current nullptr) { node ptr new node; ptr->value i; ptr->next_ptr nullptr; header…

liunx命令联系

1&#xff0c;liunx桌面和命令行之间的切换 init 3 init4 init5 2&#xff0c;liunx下用户的切换是su 用户 转载于:https://blog.51cto.com/lvjian118/1057319

测试boot库下I/O模型类型

#include #include #include <boost/asio.hpp> int main() { std::string output; #if defined(BOOST_ASIO_HAS_IOCP) output “iocp” ; #elif defined(BOOST_ASIO_HAS_EPOLL) output “epoll” ; #elif defined(BOOST_ASIO_HAS_KQUEUE) output “kqueue” ; #elif…

循环语句:For循环

Pascal中的for循环严格地建立在计数器基础上&#xff0c;循环每执行一次&#xff0c;计数器不是增加一个值就是减小一个值。 例子&#xff1a; vark,i: integer; beginK:0;for i:1 to 10 dok :ki;同样的for语句可以用正好相反的计数器来写&#xff1a; vark,i: integer; begink…

beast单元库的总结

1:凡是带有async_read 和async_write 开头都是阻塞的&#xff0c;因为在向socket底层读写缓冲区时&#xff0c;一定要读完指定的大小位置&#xff0c;因为底层写了一个for循环 2:如果要使用async_read_some开头的函数&#xff0c;一定要使用先读写包头&#xff0c;再读写包体的…

Ubuntu 找不到libc.so.6

2019独角兽企业重金招聘Python工程师标准>>> 在Ubuntu 上&#xff0c;其实这个库是存在的&#xff0c;只是地方换了&#xff0c;在"/lib/i386-linux-gnu/"下面&#xff0c;我们只需创建一个链接即可。使用下面的命令&#xff1a; rootubuntuJack:/lib/i3…

c++实现插入和冒泡排序

插入排序的最好的情况是O(n)&#xff0c;最坏的情况O(n^2),因此是稳定的 冒泡排序最好的情况是O(n)&#xff0c;最坏的情况O(n^2)因此是稳定的 //插入排序 void insert_sort(int* arr, int n) { int temp -1; for (int i1;i<n;i){ temp arr[i]; int j i - 1; //从后往前…

.net 动软代码生成器

http://www.maticsoft.com/codematic.aspx

c++实现二叉树操作

//前序 //用广度搜索 template void AVLTree::preOrder(AVLTreeNode* tree) const { /**********递归形式走/ //if (nullptr ! tree) //{ // cout << tree->key << " "; // preOrder(tree->left); // preOrder(tree->right); //} if (tree nu…

Centos下lnmp编译安装详细过程

整理下lnmp安装步骤&#xff1a; 相关软件用的lnmp一键安装的全包&#xff0c;懒得去到处找软件源 完整版&#xff1a;http://soft.vpser.net/lnmp/lnmp0.7-full.tar.gz(66.64MB) 1.系统安装必要软件 sudo -s LANGC yum -y install gcc gcc-c autoconf lib…

fstream下的读写操作

#include #include #include int main() { std::string path “D/ssss/reflection.hpp”; //这情况下&#xff0c;默认下是std::ios_base::in读入 trun:在打开时舍弃流的内容 std::ifstream open_file(path, std::ios_base::ate | std::ios_base::binary); std::size_t si…

「常微分方程」(阿諾爾德) Page 6 問題4 經過擴張相空間的每一點有且僅有一條積分曲線...

經過擴張相空間的每一點有且僅有一條積分曲線 證明:假若經過擴張相空間的某個點有兩條不同的積分曲線&#xff0c;則意味着經過相空間中的某點有兩條相曲線&#xff0c;這與常微分方程(阿諾爾德) 1.1節 問題3 經過相空間的每一點有且僅有一條相曲線 矛盾.转载于:https://www.c…

c++实现双向链表操作

#include struct node { node* pre{}; node* next{}; int data; }; //双链表创建结点 void create_node(node** header,int value) { node* current header; if (current nullptr){ node ptr new node; ptr->data value; header ptr; }else { while (current ! nullpt…

matlab学习:人脸识别之LBP (Local Binary Pattern)

1.算法简介 LBP是一种简单&#xff0c;有效的纹理分类的特征提取算法。LBP算子是由Ojala等人于1996年提出的&#xff0c;主要的论文是"Multiresolution gray-scale and rotation invariant texture classification with local binary patterns", pami, vol 24, no.7,…

利用栈解决深度搜索问题

#include #include struct Pos { int _row{}; int _col{}; Pos(int row, int col) :_row(row) , _col(col) { } Pos() { } }; std::stacks; bool CheckIsAccess(int* a, int row_size, int col_size, Pos cur) { //行坐标不合法 if (cur._row <0 || cur._row > row_siz…

组策略应用规则示例

组策略应用规则示例一、在AD中创建两个OU&#xff0c;上层为OU1&#xff0c;下层为OU2&#xff0c;在OU2中有一个用户USERA。1&#xff0c;在OU1中做组策略设置为从桌面删除回收站&#xff0c;OU2为禁止访问控制面板。因为策略没有冲突&#xff0c;这时USERA为OU1和OU2的策略累…