在应用程序开发中,可以通过函数来提高系统的性能与代码的重复利用。在SQL
Server数据库中也可以通过自定义函数来提高服务器的性能。用户自定义函数可以从外部接受必要的参数,并在内部执行一些复杂的操作,最后返回正确的结果。
在数据库开发中,笔者强烈建议数据库管理员要多用用函数。只要能够通过函数来实现的功能,那么就要用函数。或许大家还不明白其中的原因。没有关系,现把这个原则刻在心中,然后笔者再跟大家解释其中的奥妙。
一、利用函数来实现业务逻辑的优势。
1、 函数的执行速度比普通的SQL代码要快。
在同等条件下,实现同样功能的SQL代码与把SQL代码定义成函数,后者的执行性能要比前者高许多。这主要是因为在数据库中,用户自定义函数通过缓存计划并在重执行时重用它来降低SQL代码的编译开销。如现在在数据库中需要实现一个功能,要返回企业在职员工每天迟到或者旷工的人员信息。这个功能即可以每天通过一个SQL代码来实现。也可以把实现这个查询的SQL代码封装成一个函数,然后应用程序通过调用这个函数来实现这个需求。如果通过SQL代码来实现的话,每天查询一次,数据库都需要重新编译并优化这条SQL语句。而如果通过函数来调用的话,则不需要重新解析和重新优化。因为其执行计划只要运行过一次,就会在数据缓存中保存下来。下次需要调用这个函数的话,则直接调用缓存中执行计划即可。可见,通过函数来实现某些常用的功能,可以避免重复的解析与优化,缩短执行时间,提高数据库性能。
2、 模块化设计提高数据库与应用程序开发性能。
如上面这个例子,企业刚开始的时候可能需要查询迟到与旷工人员的编号、姓名、职位、事由等信息。但是后来用户的需求发生了改变,他们希望在这些信息的基础上,还能够带出当月累计迟到或者旷工的次数、是否有正当手续等信息。如果在数据库与应用程序设计开发的时候,是通过SQL代码来实现这个功能的。那么此时笔者非常不幸的告诉大家,要实现这个需求的话,必须修改源程序中嵌入的SQL代码。这是一件非常麻烦的工作。但是如果通过函数来实现的话,则应用程序的源代码基本上不需要更改。而只需要在数据库中更改这个函数的代码。这笔更改应用程序代码要简单的多,时间也可以短许多。
另外,可能不仅一个地方需要用到这个SQL代码。在日常的查询中,在员工的绩效考核系统中,在工资核算系统中都需要这些内容。如果用普通的SQL代码来实现的话,则在各个作业中都需要重复的书写这些代码。显然这个工作量非常的大。最要命的是,若以后用户需求更改了的话,需要同时修改多个地方的代码。显然通过SQL代码来实现某些需求的话,代码的重复利用程度不高。这会影响数据库的开发效率。而通过函数来实现的话,又有另一番新天地。因为只需要创建一次函数并将其存储在数据库中,那么应用程序中就可以进行多次重复调用。即使需求有改变的话,只需要更改函数,那么其他各个作业的功能也会相应的更改。
可见利用函数来实现功能,不仅可以提高数据库运行性能,而且还可以提高数据库与应用程序的开发效率。
3、 减少网络流量提高数据库运行性能。
如果利用函数来实现某些功能的话,则还可以明显的减少网络流量。如上面这个需要,要统计员工当月的迟到、早退、旷工次数。如果通过SQL代码来实现的话,则需要先把员工当月每次迟到、早退、旷工的记录返回到应用程序中,然后再在应用程序中进行相关的统计。但是如果通过函数来实现这个功能的话,则处理方式就不一样了。利用函数来实现的话,是在数据库中统计好相关的结果,如员工迟到的次数等等。然后直接把这个结果返回给应用程序。也就是说,用户最终需要的是一个统计结果。而通过SQL代码来实现的时候,数据库需要把员工迟到、旷工等违纪信息的明细返回给应用程序。而通过函数来实现的话,则只是把最后的统计结果返回给应用程序。显然利用函数来实现其网络传输的数据量要少的多。这对于网络带宽受到限制的企业来说,可以通过这种方式轻而易举的缩短用户的等待时间。如果相关的记录比较多,或者用户需要通过互联网远程访问数据库的时候,这个效果特别明显。
二、Transact-SQL 函数与CLR 函数,该用哪一种?
在SQL数据库中,不仅可以利用数据库自带的Transact-SQL语言来编写函数,而且还可以使用Microsoft
.NET Framework 编程语言来编写函数。这在很大程度上提高了函数能够实现的功能。不过两种语言在不同的情况下使用,对于数据库的性能的影响是不同的。为此数据库设计与开发人员必须了解这两种语言的差异,并在合适的情况下选择合适的语言。这有利于提高数据库的性能。在SQLServer数据库中,把利用Microsoft
.NET Framework 编程语言来实现的函数,叫做CLR函数。如CRL表量值函数用来返回单个结果的值,如字符串、数字等等。那么到底还如何进行选择呢?笔者的如下几个建议或许能够帮助大家。
第一个建议:客户端运行OR服务器运行?
以前在数据库部署的时候,由于客户端配置的问题,往往把所有的应用都放在服务器上实现。如此的话,只要提高服务器的配置即可。但是随着数据库应用越来越复杂,把所有的担子都压在数据库服务器上,已经让数据库服务器超负荷运行了。随着客户端硬件配置的提高,为此把一些运行时间比较长的作业放到客户端来运行,未尝不是分摊服务器压力的一种好方法。如果数据库设计与开发人员有这种想法的话,那么在选择使用Transact-SQL
函数还是CLR 函数的问题上,就有了方向。Transact-SQL 函数与CLR 函数都可以在服务器上运行。在服务器上运行函数的话,可以将代码与数据靠近在一起,以减少不必要的网络流量。但是就如同上面所说的,有时会数据库设计人员出于整体性能的考虑,不得不把一些运行时间比较长或者硬件资源耗用量比较大的作业放在客户端上执行。但是到目前为止,Transact-SQL
函数只能够在服务器端执行,CLR 函数的话不仅可以在服务器端运行而且还可以在客户端上执行。所以,如果要把某个复杂的作业放在客户端上运行,而这个作业又需要调用某个函数的话,那么在这种情况下就需要采用CLR
函数。
第二个建议:业务逻辑的复杂性?
利用函数来实现的功能,即可以是才十几行代码的作业,也可以是包含几百条业务逻辑的复杂功能。在编写函数的时候,到底是采用Transact-SQL
函数还是CLR 函数,还需要看看其业务逻辑的复杂性。因为Transact-SQL代码虽然也可以实现一些复杂的功能,但是其毕竟不是属于专业的开发语言。当业务逻辑比较复杂的时候,Transact-SQL代码开发和执行的时候,效率并不是很好。如现在要给用户利用随机数生成密码。在这个功能上,利用Transact-SQL代码也可以实现,但是其代码会很长。而利用CLR函数来实现的话,则只需要简单的几行。可见这个代码的编写量上就有很多的差别。代码量一增加,那么后续维护的工作量也就越大。
为此为了提高函数的开发效率,对于业务逻辑比较复杂,并且可能会占用服务器比较多的CPU或者内存资源的函数,最好采用CLR函数来实现。这不仅可以简化函数的开发,而且在有需要的时候,还可以把这个函数放在客户端上去职执行,一举多得。故在判断到底采用哪种函数为好的话,还需要考虑其业务逻辑的复杂性与硬件资源的耗用情况。
总的来说,在大部分情况下,Transact-SQL 函数与CLR 函数是通用的。但是为了取得更好的性能,可以根据以上的几个建立来判断到底利用哪种类型的函数。另外,如果采用扩展存储过程的话,最好也是采用CLR函数。因为扩展存储过程与CLR函数的兼容性比较好。但是CLR函数是利用C#等编程语言开发的,对于一些数据库管理员来说可能有一定的难度。这也可以说明,未来的数据库开发人员,往往需要多掌握几门语言,才能够胜任。光靠SQL语言往往并能够完成数据库的全部设计与开发工作。因为业务需求对数据库性能方面的要求越来越高。多门语言的结合使用,有利于数据库开发者设计性能更高的数据库应用系统,从而给用户更快的享受,提高用户满意度。
|