`

从算法入手讲解SQL Server的典型示例

 
阅读更多

从算法入手讲解SQL Server的典型示例

本文从算法入手同时通过实例来讲解如何在SQL Server数据库中实现最优最简的整个过程。


算法是计算机科学中一个重要的研究方向,是解决复杂问题的关键。在计算机世界中,算法无处不在。数据库是存储数据和执行大批量计算的场所,在数据库中使用一些简单的SQL命令,进行存储、查询、统计、以解决现实世界中的问题已经是屡见不鲜。随着数据量的大幅度增加和业务规则的日益复杂,越来越需要一种专门的方法来满足效率和准确性方面的要求。如何把解决问题的复杂算法转换为数据库能够执行的命令,也是数据库应用技术研究的一个方面。本文以MSSQL中的命令来阐述例子。


数据库中可以存储实体的数据集合,在进行运算时,数据库使用批量计算的方法来处理数据,批量的从存储设备上读取数据,处理之后又批量的写回存储设备。有的数据库提供了游标,游标可以读取出表中一行的数据中的每一个字段,对这些字段进行复杂的业务规则计算,然后再写回数据库中。与使用批量的方法比较,批量计算的方法消耗的资源相对比较少,而使用游标则占用太多的资源,速度比较慢,效率较低并且还有加锁条件等许多的限制。


比如对于数据库中存储了学生成绩student_Score(sno,cno,score,level),成绩从0分到100分不等,如果需要在分数的后面存储一个字段字level来说明成绩的优劣,90分以上的A,80-90分为B,60-80分的为C,60分以下的为D,以下有几种算法都可以达到同样的目标:


1.定义一个游标,选择student_Score表中所有的成绩记录,定义一个存储成绩的变量@cur_score,存储当前纪录的分数,定义一个存储当前分数所在成绩级别的变量@cur_level,用以存储成绩好坏的标记。算法如下:如果游标中的纪录不为空,从游标中取出当前纪录的成绩,判断成绩所在的分数段,把结果存储在变量@cur_level中,以@cur_level中的值更新当前纪录中的level字段。整个过程需要至少读取数据库两次,一次为获得纪录,一次需要写入数据库,每条记录都需要经过这个过程,效率相对低。


2.依次批量更新数据库,把所有的level字段的值设置为D,再次更新数据库,把成绩大于等于60的纪录的Level字段更新为C,依次更新B、A。这样做的一个缺点是有些纪录的Level字段被更新多次,比如一个记录最后的Level字段的值是A,则它首先被更新为D,依次被更新为C、B、A。这些重复的更新是可以被消除的,把算法改进一下就可以省去重复更新的花费。更新后的算法是这样的,把成绩介于0和60分的纪录的Level字段更新为D,依次更新各个分数段的成绩。实现的这种算法的SQL语句并不难写出,使用Between…and…表达式即可以表达例如介于80到90之间纪录的选择条件。


3.鉴于第二种方法最后的分析,使用between…and…表达式同时参照一个表来更新纪录,则可以方便表达分数段与相应的level信息,把这些信息存储到一个表level_about中,在更新student_score表的过程中可以参照这个表。计算的过程中,需要把level_about表的内容读出来,然后进行计算。对于整个计算过程来说,牺牲空间和部分效率来换来操作方便,,由于现在计算机的速度相当快,level_about表占用的空间又很小,这方面的损失可以忽略不记。Level_about表中的信息至少包含3个字段:start_score,记录起始分数,end_score记录终止分数,level记录介于起始分数和终止分数之间的分数应该得到的成绩。表中的数据应该类似于这样:


Start_score End_score level

0 59 D

60 79 C

80 89 B

90 100 A

更新student_Score表中的纪录需要依据Start_score和End_score来判断当前记录中成绩所在的Level,在MSSQL中实现的SQL语句:


Update student_score set

student_score.level=level_about.level from

level_about where student.score

between level_about.start_score and level_about.end_score

比较以上3种方法,实现同一个目的采用不同的算法实现的效果是不同的。

一些简单的算法不需要经过修改就可以直接应用到数据库中,比如业务需要每天晚上都需要结算一天的情况,一周两次自动结算奖金,结算奖金时间在每周再周一和周四的晚上0点。为了实现系统的自动结算,需要使用系统的任务,给系统制订一个作业,指定每天晚上0点结算就可以实现系统的自动结算(由于结算的时间间隔可能是会变化,不能使用作业中的定时功能)。为了可以在周一和周四结算,在数据库中设置一个表misc,其中的字段相当于全局变量,表中只有一条纪录,使用其中的一个字段(days)来记录当前结算的次数,也就是以系统开始运行为标准经过的天数。系统执行任务同时更新misc表中的days使其增长update misc set days=days+1。

业务需求是每周一和周四结算奖金,不难发现奇数次结算依次相差7天,偶数次结算依次相差7天,相邻奇数次和偶数此结算相差3天,可以使用求余的方式来统一这个问题。如果当前天数(days)与7求余结果为0或者当前天数(days)减去3之后求余的结果为0,则当前天数是结算的日期。具体的实现的算法是:

1、提取当前的天数到一个变量中declare @days int set @days=(select days from misc)。

2、判断是否满足结算条件if @days%7=0 or (@days-3)%7=0 begin…end。

类似于这样简单的算法可以直接的应用到数据库中而不会发生问题。

复杂的业务规则需要复杂的算法,复杂的规则对于一个有具体数字的变量来说,实现起来已经比较复杂,如果应用到数据库中存储的杂乱无章的一大批数字,并且实现批量的计算,则需要对算法进行大幅度的调整。

比如业务规则需要在员工每4000元的奖金中扣除400元作为重复消费,并且在扣除最后的400元,重复消费一次奖励一件产品,需要在数据库中使用一个表(award_repeat)记录产生的重复消费。如果一次扣除的奖金不足400元,在下次结算的时候接着扣除,直到扣除的奖金够400元,然后奖励一件产品,进入下次的循环,比如现在奖金总数达到了3600元,则不会扣除,如果达到了3700元,则要扣除100元,如果达到了7700元,则要扣除410元,并且产生一个重复消费。

为了实现这个规则,在员工表(member)中记录每个员工奖金的总数([total_award]),同时记录重复消费的次数([repeat_num]),在另外的过渡表(award_day)中记录每次的奖金和每次扣除重复消费的奖金,最后在奖金表(award)中综合当次奖金和当次结算需要扣除的重复消费就得到了当次结算实际发放的奖金。采用批量的计算方法,实现的算法是:在计算奖金之后,扣除重复消费之前把当前奖金累加到员工的([total_award])字段([total_award]),记录没有扣除重复消费的所有的奖金总和。实现重复消费计算的的算法是,设定条件(F1)为在member表中存在奖金总数大于等于重复消费次数加1后乘以4000,如果有满足条件F1的记录,则选择满足条件的纪录中主键和当前的日期(days)插入到重复消费表(award_repeat)中,然后更新member表中满足条件F1的repeat_num使其增加1,重复检查条件F1,直到member表中没有满足条件F1纪录。

结论:在数据库中研究和实现算法有着相当大的困难,同时也是一种挑战。随着现实世界中业务规则的日益复杂,相应的数据库应用软件实现业务规则需要的算法也日益复杂,把复杂的算法应用在数据库中需要找到一个统一的方式,在熟悉业务规则的前提下,根据数据库的特点和相应的执行命令的能力,找到一种适合数据库批量计算的步骤是解决问题的关键。

分享到:
评论

相关推荐

    sql server 中进行des加密

    在给定的文件名"SQLEncryption"中,可能包含示例代码、数据库脚本或相关的教程资源,这些资源可以帮助你更好地理解和实现SQL Server与C#中的DES加密和解密功能。在实践中,确保遵循最佳安全实践,如定期更换密钥,...

    sqlserver snowflake 函数

    使用c# 编写的 sqlserver udf 雪花函数 编译环境为 .net framework 4.5 目标数据库为 sqlserver2012 实际可以在 sqlserver2012-2019 上发布使用 注: 1. 需要开启多个实例权限 2. 需要开启单数据库信任 3. 该程序...

    sqlserver 数据库设计模板

    数据库设计是IT领域中的核心部分,特别是在关系型数据库如SQL Server中,良好的设计能确保系统的高效性和数据的一致性。以下是对"sqlserver 数据库设计模板"的详细说明: 1. **引言** - **编写目的**:设计模板...

    1204 Java 遗传算法排课java sqlserver.rar_java排课算法_排课_排课系统java_遗传算法Java

    标题中提到的“1204 Java 遗传算法排课java sqlserver.rar”是一个基于Java编程语言开发的排课系统,它采用遗传算法来优化排课过程,并将数据存储在SQL Server数据库中。SQL Server是一种关系型数据库管理系统,提供...

    解决SQLSERVER数据库驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接问题JAR包

    在SQLSERVER数据库的使用过程中,有时会出现一个棘手的问题,即驱动程序无法通过安全套接字层(SSL)加密与SQL Server建立安全连接。这个问题通常表明数据库连接在尝试使用SSL进行加密时遇到了障碍,可能影响数据的...

    Microsoft SQL Server Compact 4.0.zip

    Microsoft SQL Server Compact 4.0 for VB /MFC  SQL Server Compact 4是微软WebMatlab的默认数据库,它是一个Web技术的堆栈,用于在Windows平台上轻松地构建和部署网站。  为了增强开发和调试能力,包括设计...

    SQLServer OLAP实验详解(含数据)

    SQLServer的数据挖掘扩展了其OLAP功能,提供了预定义的算法,如关联规则、聚类、决策树和神经网络,用于发现数据中的模式和趋势。在实验中,你可能需要使用SQLServer的数据挖掘工具,如Data Mining Wizard,来创建和...

    C# 开发SQLSERVER数据库自动建表

    在IT行业中,数据库管理是至关重要的,特别是在使用像SQL Server这样的大型关系型数据库管理系统时。本文将深入探讨如何使用C#编程语言来自动化SQL Server数据库的建表过程,特别是涉及处理中文字段及其拼音首字母...

    Microsoft SQL Server Compact 4.0 SP1

    **Microsoft SQL Server Compact 4.0 SP1** 是微软推出的一款轻量级、嵌入式数据库引擎,适用于桌面和移动应用程序。SQL Server Compact (简称 SQL CE) 提供了与 SQL Server 相似的功能,但无需独立服务器环境,使得...

    轻松实现Sql Server 2005下的Base64、MD5、SHA1算法函数

    本篇文章将详细介绍如何在SQL Server 2005环境下轻松实现这三种算法的函数,帮助你有效地进行数据处理。 一、Base64编码 Base64是一种用于在网络上传输二进制数据的编码方式,它可以将任意二进制数据转换为可打印的...

    链接sqlserver报错ssl无法通过问题的解决jar.zip

    在使用Java连接SQL Server数据库时,可能会遇到一个常见的问题,即SSL加密无法通过,导致连接失败。这通常是因为Java应用程序缺少必要的SSL支持或者数据库服务器配置不正确。在本案例中,我们有两个重要的JAR文件...

    【Mycat1.6之操作SQLServer案例】

    【Mycat1.6与SQLServer操作案例详解】 Mycat是一款开源的分布式数据库中间件,它在大型分布式系统中扮演着数据库分片的角色,能够有效地解决单个数据库性能瓶颈的问题。Mycat 1.6是其一个重要版本,提供了更稳定、...

    sqlserver MD5函数

    SQL Server本身并未提供直接支持MD5加密算法的内置函数,但可以通过自定义函数的方式实现这一功能。本文将详细介绍如何在SQL Server环境中创建并使用MD5加密函数,以及相关的辅助函数。 #### 二、MD5加密原理简介 ...

    sqlserver 2000 SP4 安装包

    SQL Server 2000 Service Pack 4 (SP4) 是微软公司针对其数据库管理系统 SQL Server 2000 发布的一个重要的更新包。这个安装包包含了自 SQL Server 2000 正式版发布以来的所有累积性更新、安全补丁以及性能优化,...

    sqlserver engine原理

    SQL Server引擎原理主要涉及到SQL Server的设计思想、发展历程以及在关系数据库中的核心算法和优化策略。首先,SQL Server的设计目标是成为性能最优、最可靠、最可扩展和最易使用的数据库管理系统。为了达到这些目标...

    解决无法通过SSL加密与SQLServer建立连接

    由于项目中必须得用JDK6来作为Java环境,于是连接SQLServer时出现了com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“​ ​Java​...

    SQL-server2000的Jar驱动包

    3. **msutil.jar**: 这个JAR文件包含了SQL Server的实用工具类,用于辅助数据库操作,如日期时间处理、字符串操作、加密算法等。这些工具类可以提高开发效率,使得开发人员不必自行编写这些常见但又复杂的函数。 ...

    SqlServer经典资料

    3. SQL Server海量算法优化: 针对大数据量的处理,Sql Server提供了多种优化策略,包括索引优化、查询优化、存储过程使用、分区表、并行查询等。理解如何编写高效的SQL语句,利用索引提升查询速度,以及通过执行...

    SqlServer 数据挖掘

    SQL Server 2005 提供了数据挖掘功能,将其作为平台技术,旨在支持智能型应用程序的开发,这些应用程序能够从数据中学习并自动更新商业规则。 在智能型应用程序的示例中,如交叉销售应用,它们能根据用户行为推荐...

Global site tag (gtag.js) - Google Analytics