性能测试:动态生成SQL语句 VS 存储过程

来源:互联网 发布:mb七剑再版知乎 编辑:程序博客网 时间:2024/05/22 10:46

当软件开发使用MicrosoftSQL2005存储数据时,有多种方式来检索信息。 其中就有动态生成的SQL语句和存储过程。但是他们的性能是否一样?    

下载测试程序和源代码  

测试描述:

设计这个测试的目的是来比较在.NET应用程序中动态SQL查询语句和存储过程执行的时间是否相等。  

 测试过程中的功能

  在这两种情况下,速度测试为两套SQL语句提供完全相同的功能,这是至关重要的。这是同样重要的是,各种语句的使用。每个测试运行,以adventureworks示例数据库为例, 4 个SQL语句相当于存储过程。

四个过程如下:  

在单表中查询所有数据;

使用where条件查询一个表中的某行

在三个表中使用两个联合和where条件查询某些数据

在三个表中使用Join,子查询和where语句查询某些数据  

 循环

  执行一个单一的SELECT语句速度太快,要准确测量。为了避免错误和异常,建造回路和重复执行测试代码。每个测试,循环被执行一万次。时间测试的时间是使用秒表自动控制。每个测试是多次和平均计算结果。

  测试条件  

硬件  

测试结果如下表所示,是那些生产使用的Athlon64 3200 + 2 GB的内存。这些试验均显示出相对的进一步测试结果是在不同的设备上实验。   测试在3个作业系统中执行,每一个都是最新的Service Pack和修补程序。这些是:

Windows XP Windows Server 2003 R2 Windows Vista Ultimate   

在每个测试,该软件被编译为.NET框架3.5控制台应用程序

 Compiled using Visual Studio 2008 Professional Edition

Compiled using Visual C# 2008 Express Edition  

 结果  

下表表明四个实验中循环语句的平均时间。前两列表示使用动态生成SQL语句和存储过程,第三列表示两者的不同百分比:

                                                 Dynamic SQL   Stored Procedure    Difference

Simple Select                             21.83s                21.82s                   0.05%

Select with Where Clause            2.51s                  2.49s                   0.80%

 Select with Joins                        25.08s                25.22                   -0.56%

Select with Sub-Select                 24.68s                26.47                  -7.25%  

 结论  

 结果表示在多数情况下使用动态生成SQL语句和存储过程的不同是不容忽视的。明显的区别是在最后使用join,子查询和where语句。在这种情况下使用存储过程在性能上有小的下降。这些结果表明,普遍的观点认为,存储过程速度比动态SQL快是不正确的。这种想法往往源于错误的思想,SQL Server的预先编制的执行存储过程。不过,单是表现不应该是拒绝使用存储过程的依据,因为他们的确提供了额外的好处。

原文:http://www.blackwasp.co.uk/SpeedTestSqlSproc.aspx