知识大全 从一条select语句看Oracle数据库查询工作原理
Posted 语句
篇首语:书史足自悦,安用勤与劬。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 从一条select语句看Oracle数据库查询工作原理相关的知识,希望对你有一定的参考价值。
从一条select语句看Oracle数据库查询工作原理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
假如 我们现在利用Select语句从数据库查询数据 Oracle数据库是如何运作的呢?从中我们可以领悟到什么呢?下面 就结合一条简单的select语句 看看Oracle数据库后台的运作机制 这对于我们之后的系统管理与故障排除非常有帮助
第一步 客户端把语句发给服务器端执行
当我们在客户端执行select语句时 客户端会把这条SQL语句发送给服务器端 让服务器端的进程来处理这语句 也就是说 Oracle客户端是不会做任何的操作 他的主要任务就是把客户端产生的一些SQL语句发送给服务器端 虽然在客户端也有一个数据库进程 但是 这个进程的作用跟服务器上的进程作用事不相同的 服务器上的数据库进程才会对SQL语句进行相关的处理 不过 有个问题需要说明 就是客户端的进程跟服务器的进程是一一对应的 也就是说 在客户端连接上服务器后 在客户端与服务器端都会形成一个进程 客户端上的我们叫做客户端进程;而服务器上的我们叫做服务器进程 所以 由于所有的SQL语句都是服务器进程执行的 所以 有些人把服务器进程形象地比喻成客户端进程的 影子
第二步 语句解析
当客户端把SQL语句传送到服务器后 服务器进程会对该语句进行解析 同理 这个解析的工作 也是在服务器端所进行的 虽然这只是一个解析的动作 但是 其会做很多 小动作
查询高速缓存 服务器进程在接到客户端传送过来的SQL语句时 不会直接去数据库查询 而是会先在数据库的高速缓存中去查找 是否存在相同语句的执行计划 如果在数据高速缓存中 刚好有其他人使用这个查询语句的话 则服务器进程就会直接执行这个SQL语句 省去后续的工作 所以 采用高速数据缓存的话 可以提高SQL语句的查询效率 一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高 另一方面 也是因为这个语句解析的原因
不过这里要注意一点 这个数据缓存跟有些客户端软件的数据缓存是两码事 有些客户端软件为了提高查询效率 会在应用软件的客户端设置数据缓存 由于这些数据缓存的存在 可以提高客户端应用软件的查询效率 但是 若其他人在服务器进行了相关的修改 由于应用软件数据缓存的存在 导致修改的数据不能及时反映到客户端上 从这也可以看出 应用软件的数据缓存跟数据库服务器的高速数据缓存不是一码事
语句合法性检查
当在高速缓存中找不到对应的SQL语句时 则数据库服务器进程就会开始检查这条语句的合法性 这里主要是对SQL语句的语法进行检查 看看其是否合乎语法规则 如果服务器进程认为这条SQL语句不符合语法规则的时候 就会把这个错误信息 反馈给客户端 在这个语法检查的过程中 不会对SQL语句中所包含的表名 列名等等进行SQL他只是语法上的检查
语言含义检查
若SQL语句符合语法上的定义的话 则服务器进程接下去会对语句中的字段 表等内容进行检查 看看这些字段 表是否在数据库中 如果表名与列名不准确的话 则数据库会就会反馈错误信息给客户端
所以 有时候我们写select语句的时候 若语法与表名或者列名同时写错的话 则系统是先提示说语法错误 等到语法完全正确后 再提示说列名或表名错误 若能够掌握这个顺序的话 则在应用程序排错的时候 可以节省时间
获得对象解析锁
当语法 语义都正确后 系统就会对我们需要查询的对象加锁 这主要是为了保障数据的一致性 防止我们在查询的过程中 其他用户对这个对象的结构发生改变 对于加锁的原理与方法 我在其他文章中已经有专门叙述 在这里就略过不谈了
数据访问权限的核对
当语法 语义通过检查之后 客户端还不一定能够取得数据 服务器进程还会检查 你所连接的用户是否有这个数据访问的权限 若你连接上服务器的用户不具有数据访问权限的话 则客户端就不能够取得这些数据 故 有时候我们查询数据的时候 辛辛苦苦地把SQL语句写好 编译通过 但是 最后系统返回个 没有权限访问数据 的错误信息 让我们气半死 这在前端应用软件开发调试的过程中 可能会碰到 所以 要注意这个问题 数据库服务器进程先检查语法与语义 然后才会检查访问权限
确定最佳执行计划
当语句与语法都没有问题 权限也匹配的话 服务器进程还是不会直接对数据库文件进行查询 服务器进程会根据一定的规则 对这条语句进行优化 不过要注意 这个优化是有限的 一般在应用软件开发的过程中 需要对数据库的sql语言进行优化 这个优化的作用要大大地大于服务器进程的自我优化 所以 一般在应用软件开发的时候 数据库的优化是少不了的
当服务器进程的优化器确定这条查询语句的最佳执行计划后 就会将这条SQL语句与执行计划保存到数据高速缓存 如此的话 等以后还有这个查询时 就会省略以上的语法 语义与权限检查的步骤 而直接执行SQL语句 提高SQL语句处理效率
第三步 语句执行
语句解析只是对SQL语句的语法进行解析 以确保服务器能够知道这条语句到底表达的是什么意思 等到语句解析完成之后 数据库服务器进程才会真正的执行这条SQL语句
这个语句执行也分两种情况 一是若被选择行所在的数据块已经被读取到数据缓冲区的话 则服务器进程会直接把这个数据传递给客户端 而不是从数据库文件中去查询数据 若数据不在缓冲区中 则服务器进程将从数据库文件中查询相关数据 并把这些数据放入到数据缓冲区中
这里仍然要注意一点 就是Oracle数据库中 定义了很多种类的高速缓存 像上面所说的SQL语句缓存与现在讲的数据缓存 我们在学习数据库的时候 需要对这些缓存有一个清晰的认识 并了解各个种类缓存的作用 这对于我们后续数据库维护与数据库优化是非常有用的
第四步 提取数据
当语句执行完成之后 查询到的数据还是在服务器进程中 还没有被传送到客户端的用户进程 所以 在服务器端的进程中 有一个专门负责数据提取的一段代码 他的作用就是把查询到的数据结果返回给用户端进程 从而完成整个查询动作
从这整个查询处理过程中 我们在数据库开发或者应用软件开发过程中 需要注意以下几点
一是要了解数据库缓存跟应用软件缓存是两码事情 数据库缓存只有在数据库服务器端才存在 在客户端是不存在的 只有如此 才能够保证数据库缓存中的内容跟数据库文件的内容一致 才能够根据相关的规则 防止数据脏读 错读的发生 而应用软件所涉及的数据缓存 由于跟数据库缓存不是一码事情 所以 应用软件的数据缓存虽然可以提高数据的查询效率 但是 却打破了数据一致性的要求 有时候会发生脏读 错读等情况的发生 所以 有时候 在应用软件上有专门一个功能 用来在必要的时候清除数据缓存 不过 这个数据缓存的清除 也只是清除本机上的数据缓存 或者说 只是清除这个应用程序的数据缓存 而不会清除数据库的数据缓存
cha138/Article/program/Oracle/201311/17595相关参考
前台Ext后台ibatis 数据库分页 ORACLE: SELECT*FROM(SELECT A*ROWNUMRNFROM表名AWHERE 字段名LIKE(%||
知识大全 SQL多表链接查询、嵌入SELECT语句的子查询技术
SQL多表链接查询、嵌入SELECT语句的子查询技术 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
SQL实战新手入门:获取数据-SELECT语句(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
SQL实战新手入门:获取数据-SELECT语句(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
SQL实战新手入门:获取数据-SELECT语句(3) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
SQL实战新手入门:获取数据-SELECT语句(4) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
快速掌握MySQL数据库中SELECT语句[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
快速掌握MySQL数据库中SELECT语句[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
由于项目中需要用到批量插入为了防止用户插入重复的数据需要先判断插入的数据是不是已经存在如果存在则忽略这次插入否则插入这条数据刚开始的时候是先用一条SQL语句判断如果返回结果是真(记录已经存在)则忽
(一)子查询select*fromtableA whereidoperator(select*fromtableAawhereaid=) operaor 单条记录子查询(