我的存储过程最少返回40K行,在SSMS 2008 R2中需要20秒,数据库驻留在Sql Azure中,但是当我使用EF 5或只是普通ADo在我的c#应用程序中运行相同的Sp时。 NET需要70-80秒。
表在ScenarioID上有一个非聚集索引
Sp只是一个带有where条件的select语句。 select * from Cost where ScenarioID= @ID
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand("sp_GetActCostsByID", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@ID", SqlDbType.VarChar).Value = ID;
con.Open();
DataTable dt = new DataTable();
DateTime timee = DateTime.Now;
Console.WriteLine(timee);
dt.Load(cmd.ExecuteReader());
timee = DateTime.Now;
Console.WriteLine(timee);
}
}
有没有办法提高性能:
我的执行计划:
答案 0 :(得分:1)
ScenarioID
上的非聚集索引可能没有帮助,如果您没有INCLUDE
您尝试返回的所有列,因为它需要执行查找获取其他列 - 如果该场景有很多行,则最终可能会进行普通的表扫描。这归结为统计数据,因此服务器与服务器之间会有所不同。
如果您可以避免查找,那么您将获得更一致的性能。