各位好,小弟是个初学者,碰到一些关于mssql2005存储过程的性能问题,请教一下。
基本上,在我所看到的参考资料中,都认为:由于存储过程经过编译优化,所以使用的性能应该比直接在程序中使用SQL语句好,也就是说,应该更快,为了试验一下,我用了下面的程序和存储过程进行测试:首先是存储过程protest:set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[protest] 
AS
BEGIN
SELECT * FROM DBO.SP_PRICE_HIS
END后面是用c#写的测试程序:
//建立连接等等
static string connectionstring="Integrated Security=Yes;Initial Catalog=kcbgsc;Server=myserver\\SQLEXPRESS";
static SqlConnection connection = new SqlConnection(connectionstring);
string command1="select * from sp_price_his;";
string command2="protest;";    
SqlCommand command = connection.CreateCommand();
connection.Open();
//j是指定后面测试的循环次数
for (int j = 1000; j <= 10000; j+=1000)
     {
          command.CommandText = command1;
          DateTime start1 = DateTime.Now;//记录测试前的时间,下同
          //循环一定次数执行直接SQL语句的查询,由于只需要测试时间,不要求返回数据,下同
          for (int i = 1; i <= j; i++)
          {
              int x = command.ExecuteNonQuery();
          }
          TimeSpan spand1 = DateTime.Now - start1;//计算实际用时,下同
          command.CommandText = command2;//改用存储过程
          DateTime start2 = DateTime.Now;
          for (int i = 1; i <= j; i++)
          {
              int x = command.ExecuteNonQuery();
          }
          TimeSpan spand2 = DateTime.Now - start2;
          textboxkcb1.Text += ="循环次数:"+j.ToString()+"\t"+"直接使用sql语句:" + spand1.ToString() +"\t"+ "    使用存储过程:" + spand2.ToString() + "\r\n";          
      }
      connection.Close();

解决方案 »

  1.   

    但得出的结果,直接使用SQL语句的用时比使用存储过程的用时更短,存储过程的用时比SQL语句高出近1倍:
    循环次数:1000 直接使用sql语句:00:00:00.2812500     使用存储过程:00:00:00.5625000
    循环次数:2000 直接使用sql语句:00:00:00.5312500     使用存储过程:00:00:01.2187500
    循环次数:3000 直接使用sql语句:00:00:00.7656250     使用存储过程:00:00:01.6718750
    循环次数:4000 直接使用sql语句:00:00:00.9218750     使用存储过程:00:00:01.9218750
    循环次数:5000 直接使用sql语句:00:00:01.0781250     使用存储过程:00:00:02.3437500
    循环次数:6000 直接使用sql语句:00:00:01.3437500     使用存储过程:00:00:02.9375000
    循环次数:7000 直接使用sql语句:00:00:01.5468750     使用存储过程:00:00:03.2187500
    循环次数:8000 直接使用sql语句:00:00:01.7187500     使用存储过程:00:00:03.7500000
    循环次数:9000 直接使用sql语句:00:00:02.0468750     使用存储过程:00:00:04.2656250
    循环次数:10000 直接使用sql语句:00:00:02.2343750     使用存储过程:00:00:04.7343750
      

  2.   

    100-1000次的情况:
    循环次数:100 直接使用sql语句:00:00:00.0312500     使用存储过程:00:00:00.0468750
    循环次数:200 直接使用sql语句:00:00:00.0312500     使用存储过程:00:00:00.1093750
    循环次数:300 直接使用sql语句:00:00:00.0625000     使用存储过程:00:00:00.1406250
    循环次数:400 直接使用sql语句:00:00:00.1406250     使用存储过程:00:00:00.2187500
    循环次数:500 直接使用sql语句:00:00:00.1250000     使用存储过程:00:00:00.2656250
    循环次数:600 直接使用sql语句:00:00:00.2031250     使用存储过程:00:00:00.3125000
    循环次数:700 直接使用sql语句:00:00:00.1718750     使用存储过程:00:00:00.3750000
    循环次数:800 直接使用sql语句:00:00:00.2187500     使用存储过程:00:00:00.4531250
    循环次数:900 直接使用sql语句:00:00:00.2343750     使用存储过程:00:00:00.4843750
    循环次数:1000 直接使用sql语句:00:00:00.2656250     使用存储过程:00:00:00.5468750
      

  3.   

    10-100次的情况:
    循环次数:10 直接使用sql语句:00:00:00.0156250     使用存储过程:00:00:00
    循环次数:20 直接使用sql语句:00:00:00             使用存储过程:00:00:00.0156250
    循环次数:30 直接使用sql语句:00:00:00.0156250     使用存储过程:00:00:00.0156250
    循环次数:40 直接使用sql语句:00:00:00             使用存储过程:00:00:00.0156250
    循环次数:50 直接使用sql语句:00:00:00             使用存储过程:00:00:00.0312500
    循环次数:60 直接使用sql语句:00:00:00.0156250     使用存储过程:00:00:00.0312500
    循环次数:70 直接使用sql语句:00:00:00.0156250     使用存储过程:00:00:00.0312500
    循环次数:80 直接使用sql语句:00:00:00.0156250     使用存储过程:00:00:00.0468750
    循环次数:90 直接使用sql语句:00:00:00.0156250     使用存储过程:00:00:00.0468750
    循环次数:100 直接使用sql语句:00:00:00.0312500     使用存储过程:00:00:00.0468750
      

  4.   

    在上面的循环体中,用:
    SqlDataReader nreader = command.ExecuteReader();
    nreader.Close();
    代替:
    int   x   =   command.ExecuteNonQuery(); 
    即使用需要返回数据的情况,得出类似上面的结果