各位好,小弟是个初学者,碰到一些关于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();
基本上,在我所看到的参考资料中,都认为:由于存储过程经过编译优化,所以使用的性能应该比直接在程序中使用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();
循环次数: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
循环次数: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
循环次数: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
SqlDataReader nreader = command.ExecuteReader();
nreader.Close();
代替:
int x = command.ExecuteNonQuery();
即使用需要返回数据的情况,得出类似上面的结果