服务器

位置:IT落伍者 >> 服务器 >> 浏览文章

通过自定义函数提高服务器性能


发布日期:2023年07月23日
 
通过自定义函数提高服务器性能

在应用程序开发中可以通过函数来提高系统的性能与代码的重复利用在SQL Server数据库中也可以通过自定义函数来提高服务器的性能用户自定义函数可以从外部接受必要的参数并在内部执行一些复杂的操作最后返回正确的结果

在数据库开发中笔者强烈建议数据库管理员要多用用函数只要能够通过函数来实现的功能那么就要用函数或许大家还不明白其中的原因没有关系现把这个原则刻在心中然后笔者再跟大家解释其中的奥妙

利用函数来实现业务逻辑的优势

函数的执行速度比普通的SQL代码要快

在同等条件下实现同样功能的SQL代码与把SQL代码定义成函数后者的执行性能要比前者高许多这主要是因为在数据库中用户自定义函数通过缓存计划并在重执行时重用它来降低SQL代码的编译开销如现在在数据库中需要实现一个功能要返回企业在职员工每天迟到或者旷工的人员信息这个功能即可以每天通过一个SQL代码来实现也可以把实现这个查询的SQL代码封装成一个函数然后应用程序通过调用这个函数来实现这个需求如果通过SQL代码来实现的话每天查询一次数据库都需要重新编译并优化这条SQL语句而如果通过函数来调用的话则不需要重新解析和重新优化因为其执行计划只要运行过一次就会在数据缓存中保存下来下次需要调用这个函数的话则直接调用缓存中执行计划即可可见通过函数来实现某些常用的功能可以避免重复的解析与优化缩短执行时间提高数据库性能

模块化设计提高数据库与应用程序开发性能

如上面这个例子企业刚开始的时候可能需要查询迟到与旷工人员的编号姓名职位事由等信息但是后来用户的需求发生了改变他们希望在这些信息的基础上还能够带出当月累计迟到或者旷工的次数是否有正当手续等信息如果在数据库与应用程序设计开发的时候是通过SQL代码来实现这个功能的那么此时笔者非常不幸的告诉大家要实现这个需求的话必须修改源程序中嵌入的SQL代码这是一件非常麻烦的工作但是如果通过函数来实现的话则应用程序的源代码基本上不需要更改而只需要在数据库中更改这个函数的代码这笔更改应用程序代码要简单的多时间也可以短许多

另外可能不仅一个地方需要用到这个SQL代码在日常的查询中在员工的绩效考核系统中在工资核算系统中都需要这些内容如果用普通的SQL代码来实现的话则在各个作业中都需要重复的书写这些代码显然这个工作量非常的大最要命的是若以后用户需求更改了的话需要同时修改多个地方的代码显然通过SQL代码来实现某些需求的话代码的重复利用程度不高这会影响数据库的开发效率而通过函数来实现的话又有另一番新天地因为只需要创建一次函数并将其存储在数据库中那么应用程序中就可以进行多次重复调用即使需求有改变的话只需要更改函数那么其他各个作业的功能也会相应的更改

可见利用函数来实现功能不仅可以提高数据库运行性能而且还可以提高数据库与应用程序的开发效率

减少网络流量提高数据库运行性能

如果利用函数来实现某些功能的话则还可以明显的减少网络流量如上面这个需要要统计员工当月的迟到早退旷工次数如果通过SQL代码来实现的话则需要先把员工当月每次迟到早退旷工的记录返回到应用程序中然后再在应用程序中进行相关的统计但是如果通过函数来实现这个功能的话则处理方式就不一样了利用函数来实现的话是在数据库中统计好相关的结果如员工迟到的次数等等然后直接把这个结果返回给应用程序也就是说用户最终需要的是一个统计结果而通过SQL代码来实现的时候数据库需要把员工迟到旷工等违纪信息的明细返回给应用程序而通过函数来实现的话则只是把最后的统计结果返回给应用程序显然利用函数来实现其网络传输的数据量要少的多这对于网络带宽受到限制的企业来说可以通过这种方式轻而易举的缩短用户的等待时间如果相关的记录比较多或者用户需要通过互联网远程访问数据库的时候这个效果特别明显

TransactSQL 函数与CLR 函数该用哪一种?

在SQL数据库中不仅可以利用数据库自带的TransactSQL语言来编写函数而且还可以使用Microsoft NET Framework 编程语言来编写函数这在很大程度上提高了函数能够实现的功能不过两种语言在不同的情况下使用对于数据库的性能的影响是不同的为此数据库设计与开发人员必须了解这两种语言的差异并在合适的情况下选择合适的语言这有利于提高数据库的性能在SQLServer数据库中把利用Microsoft NET Framework 编程语言来实现的函数叫做CLR函数如CRL表量值函数用来返回单个结果的值如字符串数字等等那么到底还如何进行选择呢?笔者的如下几个建议或许能够帮助大家

第一个建议客户端运行OR服务器运行?

以前在数据库部署的时候由于客户端配置的问题往往把所有的应用都放在服务器上实现如此的话只要提高服务器的配置即可但是随着数据库应用越来越复杂把所有的担子都压在数据库服务器上已经让数据库服务器超负荷运行了随着客户端硬件配置的提高为此把一些运行时间比较长的作业放到客户端来运行未尝不是分摊服务器压力的一种好方法如果数据库设计与开发人员有这种想法的话那么在选择使用TransactSQL 函数还是CLR 函数的问题上就有了方向TransactSQL 函数与CLR 函数都可以在服务器上运行在服务器上运行函数的话可以将代码与数据靠近在一起以减少不必要的网络流量但是就如同上面所说的有时会数据库设计人员出于整体性能的考虑不得不把一些运行时间比较长或者硬件资源耗用量比较大的作业放在客户端上执行但是到目前为止TransactSQL 函数只能够在服务器端执行CLR 函数的话不仅可以在服务器端运行而且还可以在客户端上执行所以如果要把某个复杂的作业放在客户端上运行而这个作业又需要调用某个函数的话那么在这种情况下就需要采用CLR 函数

第二个建议业务逻辑的复杂性?

利用函数来实现的功能即可以是才十几行代码的作业也可以是包含几百条业务逻辑的复杂功能在编写函数的时候到底是采用TransactSQL 函数还是CLR 函数还需要看看其业务逻辑的复杂性因为TransactSQL代码虽然也可以实现一些复杂的功能但是其毕竟不是属于专业的开发语言当业务逻辑比较复杂的时候TransactSQL代码开发和执行的时候效率并不是很好如现在要给用户利用随机数生成密码在这个功能上利用TransactSQL代码也可以实现但是其代码会很长而利用CLR函数来实现的话则只需要简单的几行可见这个代码的编写量上就有很多的差别代码量一增加那么后续维护的工作量也就越大

为此为了提高函数的开发效率对于业务逻辑比较复杂并且可能会占用服务器比较多的CPU或者内存资源的函数最好采用CLR函数来实现这不仅可以简化函数的开发而且在有需要的时候还可以把这个函数放在客户端上去职执行一举多得故在判断到底采用哪种函数为好的话还需要考虑其业务逻辑的复杂性与硬件资源的耗用情况

总的来说在大部分情况下TransactSQL 函数与CLR 函数是通用的但是为了取得更好的性能可以根据以上的几个建立来判断到底利用哪种类型的函数另外如果采用扩展存储过程的话最好也是采用CLR函数因为扩展存储过程与CLR函数的兼容性比较好但是CLR函数是利用C#等编程语言开发的对于一些数据库管理员来说可能有一定的难度这也可以说明未来的数据库开发人员往往需要多掌握几门语言才能够胜任光靠SQL语言往往并能够完成数据库的全部设计与开发工作因为业务需求对数据库性能方面的要求越来越高多门语言的结合使用有利于数据库开发者设计性能更高的数据库应用系统从而给用户更快的享受提高用户满意度

上一篇:网络游戏服务器端编程:数据查询语句[2]

下一篇:vsftpd frequently asked questions