SQL Server数据库存储过程的发展历史

SQL Server存储过程可以是Transact-SQL(T-SQL)语句,或者是.NET框架的公共语言运行时(CLR),它是专为方便数据库查询而设计的。它们接受输入参数,返回输出参数,可以在数据库中执行增删改查各种操作。存储过程提供了大量便利,从降低网络交通量到重用缓存执行计划,还增强了安全性,提升了易维护性。

SQL Server 2008版本引入了一批新功能,与早期的相同产品SQL Server 2005相比,在存储过程性能方面提供了极大的提升。三年后,2008 R2推出,该版本对存储过程只有几处较小的调整。而即将在今年初发布的SQL Server 2012将实现大量自身性能的提升。

存储过程的发展

SQL Server 2008和2008 R2中存储过程最大的提升之处是表值参数。这种参数类型可以把多行数据分组成数据集,然后把它们一次性送到数据库服务器,减少了客户端和服务器之间的往返交互,而且它不需要创建临时表或者大量参数。表值参数在提取数据时不需要施加任何锁。该功能还支持指定排序顺序。

表值参数的结构很容易理解和使用,而且它可以适应复杂的业务逻辑。使用表值参数与使用传统的存储过程参数没有什么不同。首先,声明一个用户定义的表类型,并使用该表类型输入参数创建存储过程。接下来,声明表类型变量并引用它。使用“INSERT”语句给表变量赋值,而不是使用“SET”语句或者“SELECT”语句。最后,把填充后的表变量加到存储过程中作为输入参数。

SQL Server 2008还新增了“MERGE”语句,支持把多个数据操纵语言(DML)操作合并到一个T-SQL语句中。在连接表上使用合适的索引,你可以得到查询性能的提升。这是因为单个“MERGE”语句降低了数据在源表和目标表处理的时间。在SQL Server 2005以及更早的版本中,每个“INSERT”,“DELETE”和“UPDATE”语句都必须一次处理完数据。“MERGE”非常有用,比如说当你做两个表的同步时就可以用它。

在SQL Server 2008和2008 R2存储过程中,分组操作的功能通过“GROUPING SET”语法得到了增强。简单的“GROUP BY”语句为所有列值的每个组合返回一行,而“GROUPING SETS”为每列的每个唯一值返回一行。没有这个新功能的话,后者将要使用“UNION”结构为每列执行多次“GROUP BY”语句。那样很明显会需要更多资源,比如:磁盘IO操作、内存以及运行时间。

在存储过程编程时,SQL Server 2008和2008 R2还可以使用新行构造器在一行“INSERT”语句中插入多行。数据库管理员对这部分语法可能非常熟悉了:“INSERT INTO TABLE (COLa, COLb, COLc) … VALUES (V1a, V1b, V1c …), (V2a, V2b, V2c …), … (V1000a, V1000b, V1000c …)”。其中数字“1000”表示每个插入语句允许的最大行数。新的“INSERT”语法更简介,因为它去除了重复的字符串,并通过降低网络交通量,实现了与服务器更快的交互。

在我的第三个试验中,我运行了10批语句,每批1000条新类型的插入,并行执行了一万条独立插入。每个测试算作一次交互,但是与旧式的“INSERT”相比,简化后的行构造削减了交易数量和服务器传送的字节数达1000倍,降低了客户端发送数据时间三倍,客户端处理时间300倍。整体执行时间下降超过一半。

2012年的存储过程

在即将发布的新版本中,SQL Server存储过程还会有一些调整。在SQL Server 2012中,通过使用列存储索引,数据仓库中存储过程的性能可以加快十倍、百倍或者千倍,列存储索引是第三方社区技术预览流行的可扩展特性,该版本预计在今年夏季发布。列存储索引不像传统基于行的索引结构(也称为“行存储”索引),它一次对一列进行分组并存储索引数据,因此极大地降低了查询执行时间。

SQL Server 2012还支持开发者对大对象数据类型联机重建索引。也就是说,在SQL Server 2008 R2以及更早的版本中,用户不能对varchar(max),nvarchar(max)或者varbinary(max)列,或者XML数据类型联机执行重建操作。现在,存储过程从这些数据类型提取数据也不必等待数据库维护窗口整理索引,因此提升了存储过程性能。

另一项新功能是称为“FORCESCAN”的查询优化器提示。当SQL Server查询优化器低估了返回行数并误选择了索引查找操作时,SQL Server开发者可以让查询扫描替代索引。这样的话,该查询处理花更少时间久可以完成了。

我这里只是对于SQL Server 2008,2008 R2和2012各个版本关于存储过程性能的特性做了一点走马观花的介绍。在这些SQL Server版本中还有大量细微的变化,这些变更也间接地位存储过程性能提升做贡献,比如:新的函数和语句,过滤索引和新的执行计划指南。但是这里列出的功能,不管你使用的是哪个版本,都肯定会给你的查询带来比以往更多的性能提升。

时间: 2024-11-10 07:12:03

SQL Server数据库存储过程的发展历史的相关文章

调用SQL SERVER数据库存储过程实现ASP用户身份验证

server|存储过程|数据|数据库 在我们编写用户身份验证程序中,很容易用ASP调用SQL语句来检索数据表中是否有条件相符的记录,然后再用ASP进行相关处理. 条条道路通罗马!当然,我们也可以用SQL SERVER数据库的存储过程来轻松实现这个功能.虽然相对而言较复杂,但其效率的提升是很明显的,因为存储过程是在数据库中已经编译好的一段程序,我们只需用ASP将其所用的各种参数正确传递就行了. 本文也主要是想通过一个简单的事例,向大家介绍一下如何在ASP中调用带参数的存储过程.希望大家能从中得到更

如何查看SQL Server某个存储过程的执行历史

在SQL Server 2008中,提供了审核的功能,让这个以前看似很难的工作变得容易多了.下面是一个简单的范例 1. 创建一个服务器审核 选中它,启动它 2. 创建一个数据库审核规范 &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 选中它,启用它 3. 查看效果(多次执行某个存储过程)

pl/sql-SQL server数据库 存储过程可以用PL/SQL写么?

问题描述 SQL server数据库 存储过程可以用PL/SQL写么? SQL server数据库 存储过程可以用PL/SQL写么? 解决方案 可以 解决方案二: SQL SERVER数据库开发之存储过程应用SQL SERVER数据库开发之存储过程应用SQL SERVER数据库开发之存储过程应用

动态创建SQL Server数据库、表、存储过程

server|创建|存储过程|动态|数据|数据库 下面是利用SQL语句创建数据库.表.存储过程.视图.索引.规则.修改表.查看数据等的方法.所要增加的控件如下: Imports System.DataImports System.Data.SqlClient Public Class Form1  Inherits System.Windows.Forms.Form  Private ConnectionString As String = "Data Source=.;Initial Cata

SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?

原文:SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?   本文出处:http://www.cnblogs.com/wy123/p/6704619.html      问题背景 在写SQL Server存储过程中,如果存储过程中定义了临时表,有些人习惯在存储过程结束的时候一个一个显式地删除过程中定义的临时表(drop table #tName),有些人又没有这个习惯,对于不明真相的群众或者喜欢思考的人会问,存储过程中定义的临

SQL SERVER数据库的作业的脚本及存储过程_MsSql

IF EXISTS (SELECT name FROM sysobjects WHERE name = N'cg_DoBackupJob' AND type = 'P') DROP PROCEDURE cg_DoBackupJob GO CREATE PROCEDURE [cg_DoBackupJob] @DataBaseName varchar(100), @FileHead varchar(50), @isFullBackup bit, -- 0 差量备份 1 完整备份 @FolderPat

找到SQL Server数据库历史增长信息

原文:找到SQL Server数据库历史增长信息     很多时候,在我们规划SQL Server数据库的空间,或向存储方面要空间时,都需要估算所需申请数据库空间的大小,估计未来最简单的办法就是看过去的趋势,这通常也是最合理的方式.     通常来讲,一个运维良好的数据库都需要做定期基线(baseline),有了基线才会知道什么是正常.一个简单的例子例如,一些人的血压平常偏低,那么80的低压对他来说就是不正常了.但现实情况是大多数系统并没有采集基线的习惯,因此在需要规划空间想要看历史增长时,就没

数据库 sql语言-SQL Server创建存储过程,计算每个同学的平均成绩并标记“优秀学生”

问题描述 SQL Server创建存储过程,计算每个同学的平均成绩并标记"优秀学生" 如题:请用命令行创建存储过程,计算每个同学的平均成绩,写入S_AVG表,平均成绩大于85的学生,Flag标记为"优秀学生",平均成绩低于60的的学生,Flag标记为"延迟毕业",其他学生Flag标记为"常规学生". 能查到的有关例子太少了,自学不成功,求大神解答-- 解决方案 分步做 1.计算每个同学的平均成绩,写入S_AVG表 insert

从客户端提升SQL Server数据库性能

第一:编写限制搜索范围的查询语句. 众所周知,在数据库查询的时候返回记录的多少直接关系到查询的效率.所以,在客户端通过一定的条件语句,限制搜索的范围,往往可以大幅度的提高查询的效率. 如用户在客户端查询数据库的时候,在查询语句中,加入TOP语句,让其显示前面的50条或者100条记录.因为根据经验,用户在查询数据的时候,60%左右要查看的都是靠前面的记录.特别是在一些历史交易信息表中,如在ERP系统的库存交易表中,就可以只显示前面几百条的记录,而不需要显示所有的记录.当用户觉得记录不够时,可以按"