热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在SQLServer数据库中使用自定义函数增强服务器性能

导读:在应用程序开发中,可以通过函数来提高系统的性能与代码的重复利用。在SQLServer数据库中也可以通过自定义函数来提高服务器的性能。用户自定义函数可以从外部接受必要的参数,并在内部执行一些复杂的操作,最后返回正确的结果。这项技术的出现很
导读:在应用程序开发中,可以通过函数来提高系统的性能与代码的重复利用。在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语言往往并能够完成数据库的全部设计与开发工作。因为业务需求对数据库性能方面的要求越来越高。多门语言的结合使用,有利于数据库开发者设计性能更高的数据库应用系统,从而给用户更快的享受,提高用户满意度。关于通过自定义函数提高服务器性能的问题就为大家讲述到这,希望文中的内容能够帮到大家。

推荐阅读
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文详细介绍了解决全栈跨域问题的方法及步骤,包括添加权限、设置Access-Control-Allow-Origin、白名单等。通过这些操作,可以实现在不同服务器上的数据访问,并解决后台报错问题。同时,还提供了解决second页面访问数据的方法。 ... [详细]
author-avatar
半暖半夏半流年
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有