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