第八个技巧慎用Like等通配符
Like关键字从技术上来说是一个非常友善的通配符利用这个通配符我们可以实现很多模糊查询如现在在一个人事档案系统中用户想知道身份证号码以开头的人事信息此时就可以利用Like语句实现我们可以利用下面的条件语句实现我们的需求where 身份证号码 like %通过这个条件语句可以查到所有身份证以开头的号码
但是当用户在一张大表中采用这个LIKE语句的话就会发现这个查询语句的运行效率非常的慢这是什么原因造成的呢?其实不管是Like 关键字若采用MATCHES关键字的话若在大量数据中查找符合条件的记录则其运行效率也比较低这主要是其技术特性所造成的
Like与Matches两个关键字其支持通配符匹配在有些专业书籍上把这个叫做正规表达式不过由于在利用这些关键字查询的时候 数据库系统不是通过索引来查询而是采用顺序扫描的方式来查询显然真是这种技术特性造成了Like与Mateches两个关键字查询效率的低下特别是在复杂查询或者大表查询中用户可以明显感觉到速度比较慢
索引是数据库中的一个重要的数据结构索引如果利用的合理的话可以大幅度的提升数据库的查询性能一般情况下我们在数据库设计的时候要充分的利用索引来提高数据库的运行效率如对于一些经常需要用到的查询功能我们需要为没有指定外键的列建立索引;如有查询大表数据而且又需根据好几个字段的值对其进行排序也需要在这些列上建立复合索引特别是在一些应用系统上往往可以按以下字段的名称就会对这个字段进行排序遇到这种情况的话更加需要在这些频繁进行排序的列上建立索引以提高重新排序的效率可见若在查询的时候若不能利用索引提高查询效率的话则就好像跑车失去四轮驱动速度会大受影响
所以在数据库系统设计中要尽量避免采用Like或者Matche关键字有时候我们可以利用其他运算符号来代替如我们可以利用〉(大于)或者<(小于)符号来达到类似的需求若真的要采用这两个关键字的话则就需要做好查询优化方面的工作如不要在基础表中直接利用这个两个关键字而是通过报表视图或者临时表等来查询以减少其不良影响
第九个技巧利用注释提高查询语句的可读性
在数据库设计中有一个非常奇怪的现象一些专家级的数据库设计人员在写查询语句的时候非对语句进行详细的注释有时会注释的内容大大超过了查询代码本身的篇幅可是往往一些入门不久的数据库设计人员不喜欢写注释语句这是一个很反常的现象
笔者刚开始接触数据库的时候也不喜欢写注释语句觉得写注释语句太浪费时间但是一个偶然的事件让笔者改掉了这个坏习惯那时笔者在观摩一个专家设计数据库的时候被其密密麻麻的注释惊呆了看了其代码之后笔者可以非常轻松的阅读完其所有的代码不愧为是专家级的人物看了他的注释之后在看看自己编写的代码注视那真是大巫见小巫了从此之后笔者也在慢慢培养自己编写代码的习惯现在笔者在数据库设计的时候注释已经写的很详细了至少笔者的同事在看到我的注释之后不用看源代码就知道笔者要实现的目的了
在编写注释的时候要注意几个问题
一是注释越详细越好其实注释最多牺牲一点磁盘空间而不会对数据库的性能产生任何不良的影响相反注释详细的话对于后续数据库维护与管理系统二次开发的等等都会提供很大的帮助
二是最好采用英文注释若采用中文注释的话有时候数据库语言设置不当在数据库实例安装的时候不会把中文的注释带过去所以作为数据库管理员要有一定的英语基础学会利用英语写注释其实这也不是很难只要多看看别人设计的数据库注释把他们常用的注释复制下来通过选择合适的进行复制粘贴就可以完成任务
三是不仅在写查询语句的时候要做好代码的注释工作在编写其他代码的时候如过程函数等等也要添加详细的代码以增加这些复杂功能的可读性
四是注释的内容一般注释应该包含如下几方面的内容一是这段代码要实现的功能;二是这段代码需要调用的参数;三是这段代码输出的结果若是多表关联查询的话最好能够说明表之间的对应关系若在查询语句中直接调用了函数的话则最好能够注明这个函数的功能;等等终止一个原则就是让其他人看到这个注释不再需要去查询其他的资料就可以明白这段代码的含义
详细的注释内容不仅不会降低数据库的运行性能而且还可以提高数据库的管理与维护的效率;同时也可以加快前台应用程序开发设计的速度又因为查询语句是系统中利用的最多的语句也是引用的最频繁的语句故在查询语句中更加需要做好相关的注释
第十个技巧必要的时候限制用户所使用的行
在使用一些大型管理系统的时候如ERP系统我们若查询产品信息默认的情况下若记录比较多的时候其不会把所有的记录都查询出来如在ERP系统的数据库中其有个产品信息而端子类的产品信息就占据到个此时我们在查询条件中若产品类别限制为端子的话则其查询出来的结果也可能不是所有的端子默认显示的话可能只有前面的个端子类产品若用户需要看到全部的产品信息就需要点击显示全部按钮才可以显示出全部的信息
其实不管是一些应用程序如此设计在Oracle数据库中本身也有这方面的限制如直接在PL/SQL客户端中查询数据的话其显示的记录默认情况下也是有限制的而不会把所有符合条件的语句查询出来若用户需要查询所有符合条件的记录则需要点击继续按钮以让数据库显示所有的记录
为什么要做类似的限制呢?这主要就是为了提高数据库查询的性能我们直接在数据库服务器上在几百万条记录中查询的话显示几百条记录跟现实几千条记录所花费的时间明显不同前者可能只需要秒即可而后者可能需要分钟所以为了减少用户等待的时间我们往往需要限制首次查询默认显示的记录数字
如我们往往在查询语句中利用top 来让数据库只显示前条记录如此的话可以明显的缩短用户的等待时间默认情况下是根据记录创建的时间顺序来显示记录的最迟创建的记录其显示在最前以此类推
当用户需要的数据在前面条之内则就不需要再查看其他记录了相反若不在的话则就需要查询全部记录信息了