rowid 会影响sql的执行性能吗
发布网友
发布时间:2022-04-09 15:19
我来回答
共1个回答
热心网友
时间:2022-04-09 16:49
共享sql语句
Oracle在执行每条sql语句的时候都会先对语句进行语法分析,而这个过程是比较消耗资源的,为了能够略过这个步骤从而提高sql语句的执行效率,oracle采用的共享sql语句的办法,就是把每条从用户发出的sql存储到sga(system global area)系统全局区的共享池当(shared buffer pool)中,这个内存块当中的所有sql语句能够被数据库的所有用户共享;所以当你发出一条sql语句的时候,oracle会先去共享池当中查找是否存在(之所以会有十分存在的说法,是因为这块共享池大小是有限的(一块内存区域),当该共享池被用满后会被后来的重写掉,可以通过修改系统参数来修改该共享池的大小)这么一sql语句的执行计划,如果存在则会直接得到该sql语句的执行计划和执行路径,这么一来就大大节省了系统内存并且提高了sql语句的执行效率;
但是oracle对是否相同的语句的判断是非常严格的,包括发出sql的用户和sql语句的大小写、空格、换行和注释都必须一致才能被认为相同的sql语句;
下面是oracle判断相同的sql语句的执行步骤:
1、
对所发出的语句的文本串进行hasehd[1],如果得到的hash值和共享池中的hash值相等,那么执行第2步骤;
2、
对所发出的语句包括大小写、空格、换行和注释等与第1步骤得到的所有sql语句进行比较;
[1].散列函数(或散列算法)是一种从任何一种数据中创建小的数字“指纹”的方法。该函数将数据打乱混合,重新创建一个叫做散列值的指纹。散列值通常用来代表一个短的随机字母和数字组成的字符串。好的散列函数在输入域中很少出现散列冲突。
大家可能不明白,为什么还分了2个步骤进行,直接进行第2个步骤不就可以了?是的,执行第2个步骤才是真正的比较和验证2个sql语句是否相同的步骤,但是如果oracle针对每条发出的sql都直接从大小写、空格、换行和注释方面进行比较效率不是非常低下的吗?Hash算法可以有效的提高验证的效率。
ROWID
是一个伪列,既然是一个伪列,那么该元素是不存在物理存储当中的,是系统自定义的,所以你无法对其做增、改和删操作,但是你可以像使用普通列一样来使用它,每个表都有一个rowid的伪列。一旦一行数据记录被插入到表中,那么该行的rowid的生命周期是唯一的,即使该行发生了数据迁移;
使用rowid的原因:
大家可能都知道说用索引来访问数据表的数据是最快的,那么索引当中就存放着包含rowid的信息,这样当我们使用索引的时候就能快速找到对应的rowid,Rowid对访问表中的给定的行提供了最快的访问方法,通过rowid可以直接定位到相应的数据块上,然后将其读入内存(内存读取的数据比磁盘的数据N快,这里不讨论这个了)。
ROW SOURCE
行源,返回的符合条件的集合,可以是全表的数据集合,也可以是表中部分数据集合;
Predicate
谓词,where*条件;