oracle数据库查询?oracle与金蝶用友区别
各位老铁们,大家好,今天由我来为大家分享oracle数据库查询,以及oracle与金蝶用友区别的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
Oracle数据库查询十个小技巧(三)
第八个技巧慎用Like等通配符
Like关键字从技术上来说是一个非常友善的通配符利用这个通配符我们可以实现很多模糊查询如现在在一个人事档案系统中用户想知道身份证号码以开头的人事信息此时就可以利用Like语句实现我们可以利用下面的条件语句实现我们的需求 where身份证号码 like%通过这个条件语句可以查到所有身份证以开头的号码
但是当用户在一张大表中采用这个LIKE语句的话就会发现这个查询语句的运行效率非常的慢这是什么原因造成的呢?其实不管是Like关键字若采用MATCHES关键字的话若在大量数据中查找符合条件的记录则其运行效率也比较低这主要是其技术特性所造成的
Like与Matches两个关键字其支持通配符匹配在有些专业书籍上把这个叫做正规表达式不过由于在利用这些关键字查询的时候数据库系统不是通过索引来查询而是采用顺序扫描的方式来查询显然真是这种技术特性造成了Like与Mateches两个关键字查询效率的低下特别是在复杂查询或者大表查询中用户可以明显感觉到速度比较慢
索引是数据库中的一个重要的数据结构索引如果利用的合理的话可以大幅度的提升数据库的查询性能一般情况下我们在数据库设计的时候要充分的利用索引来提高数据库的运行效率如对于一些经常需要用到的查询功能我们需要为没有指定外键的列建立索引;如有查询大表数据而且又需根据好几个字段的值对其进行排序也需要在这些列上建立复合索引特别是在一些应用系统上往往可以按以下字段的名称就会对这个字段进行排序遇到这种情况的话更加需要在这些频繁进行排序的列上建立索引以提高重新排序的效率可见若在查询的时候若不能利用索引提高查询效率的话则就好像跑车失去四轮驱动速度会大受影响
所以在数据库系统设计中要尽量避免采用Like或者Matche关键字有时候我们可以利用其他运算符号来代替如我们可以利用〉(大于)或者<(小于)符号来达到类似的需求若真的要采用这两个关键字的话则就需要做好查询优化方面的工作如不要在基础表中直接利用这个两个关键字而是通过报表视图或者临时表等来查询以减少其不良影响
第九个技巧利用注释提高查询语句的可读性
在数据库设计中有一个非常奇怪的现象一些专家级的数据库设计人员在写查询语句的时候非对语句进行详细的注释有时会注释的内容大大超过了查询代码本身的篇幅可是往往一些入门不久的数据库设计人员不喜欢写注释语句这是一个很反常的现象
笔者刚开始接触数据库的时候也不喜欢写注释语句觉得写注释语句太浪费时间但是一个偶然的事件让笔者改掉了这个坏习惯那时笔者在观摩一个专家设计数据库的时候被其密密麻麻的注释惊呆了看了其代码之后笔者可以非常轻松的阅读完其所有的代码不愧为是专家级的人物看了他的注释之后在看看自己编写的代码注视那真是大巫见小巫了从此之后笔者也在慢慢培养自己编写代码的习惯现在笔者在数据库设计的时候注释已经写的很详细了至少笔者的同事在看到我的注释之后不用看源代码就知道笔者要实现的目的了
在编写注释的时候要注意几个问题
一是注释越详细越好其实注释最多牺牲一点磁盘空间而不会对数据库的性能产生任何不良的影响相反注释详细的话对于后续数据库维护与管理系统二次开发的等等都会提供很大的帮助
二是最好采用英文注释若采用中文注释的话有时候数据库语言设置不当在数据库实例安装的时候不会把中文的注释带过去所以作为数据库管理员要有一定的英语基础学会利用英语写注释其实这也不是很难只要多看看别人设计的数据库注释把他们常用的注释复制下来通过选择合适的进行复制粘贴就可以完成任务
三是不仅在写查询语句的时候要做好代码的注释工作在编写其他代码的时候如过程函数等等也要添加详细的代码以增加这些复杂功能的可读性
四是注释的内容一般注释应该包含如下几方面的内容一是这段代码要实现的功能;二是这段代码需要调用的参数;三是这段代码输出的结果若是多表关联查询的话最好能够说明表之间的对应关系若在查询语句中直接调用了函数的话则最好能够注明这个函数的功能;等等终止一个原则就是让其他人看到这个注释不再需要去查询其他的资料就可以明白这段代码的含义
详细的注释内容不仅不会降低数据库的运行性能而且还可以提高数据库的管理与维护的效率;同时也可以加快前台应用程序开发设计的速度又因为查询语句是系统中利用的最多的语句也是引用的最频繁的语句故在查询语句中更加需要做好相关的注释
第十个技巧必要的时候限制用户所使用的行
在使用一些大型管理系统的时候如ERP系统我们若查询产品信息默认的情况下若记录比较多的时候其不会把所有的记录都查询出来如在ERP系统的数据库中其有个产品信息而端子类的产品信息就占据到个此时我们在查询条件中若产品类别限制为端子的话则其查询出来的结果也可能不是所有的端子默认显示的话可能只有前面的个端子类产品若用户需要看到全部的产品信息就需要点击显示全部按钮才可以显示出全部的信息
其实不管是一些应用程序如此设计在Oracle数据库中本身也有这方面的限制如直接在PL/SQL客户端中查询数据的话其显示的记录默认情况下也是有限制的而不会把所有符合条件的语句查询出来若用户需要查询所有符合条件的记录则需要点击继续按钮以让数据库显示所有的记录
为什么要做类似的限制呢?这主要就是为了提高数据库查询的性能我们直接在数据库服务器上在几百万条记录中查询的话显示几百条记录跟现实几千条记录所花费的时间明显不同前者可能只需要秒即可而后者可能需要分钟所以为了减少用户等待的时间我们往往需要限制首次查询默认显示的记录数字
如我们往往在查询语句中利用top来让数据库只显示前条记录如此的话可以明显的缩短用户的等待时间默认情况下是根据记录创建的时间顺序来显示记录的最迟创建的记录其显示在最前以此类推
lishixinzhi/Article/program/Oracle/201311/16756
oracle数据库有哪些查询工具
1.oracle sql developer:甲骨文官方出品,优点在于:精准书签,可方便设置...
2.pl sql developer:集成开发环境,专用于oracle数据库存储的程序单元...
3.toad:收费工具。精确书签、自动大小写关键字、可设智能提示范围、语法纠错等。
4.EnterpriseManager,企业管理器,图形化数据管理。
5.si object browser:在图形用户界面上对数据库对象创建编辑,可高效辅助开发...
从一条select语句看Oracle数据库查询工作原理
假如我们现在利用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语句缓存与现在讲的数据缓存我们在学习数据库的时候需要对这些缓存有一个清晰的认识并了解各个种类缓存的作用这对于我们后续数据库维护与数据库优化是非常有用的
第四步提取数据
当语句执行完成之后查询到的数据还是在服务器进程中还没有被传送到客户端的用户进程所以在服务器端的进程中有一个专门负责数据提取的一段代码他的作用就是把查询到的数据结果返回给用户端进程从而完成整个查询动作
从这整个查询处理过程中我们在数据库开发或者应用软件开发过程中需要注意以下几点
一是要了解数据库缓存跟应用软件缓存是两码事情数据库缓存只有在数据库服务器端才存在在客户端是不存在的只有如此才能够保证数据库缓存中的内容跟数据库文件的内容一致才能够根据相关的规则防止数据脏读错读的发生而应用软件所涉及的数据缓存由于跟数据库缓存不是一码事情所以应用软件的数据缓存虽然可以提高数据的查询效率但是却打破了数据一致性的要求有时候会发生脏读错读等情况的发生所以有时候在应用软件上有专门一个功能用来在必要的时候清除数据缓存不过这个数据缓存的清除也只是清除本机上的数据缓存或者说只是清除这个应用程序的数据缓存而不会清除数据库的数据缓存
lishixinzhi/Article/program/Oracle/201311/17595
如果你还想了解更多这方面的信息,记得收藏关注本站。