我有一个存储过程,它返回至少 40K 行,在数据库驻留在 Sql Azure 中的 SSMS 2008 R2 中大约需要 20 秒,但是当我使用 EF 5 或普通 ADo 在我的 c# 应用程序中运行相同的 Sp 时。 NET 大约需要 70-80 秒。
表在 ScenarioID 上有非聚集索引
Sp只是一个带有where条件的select语句。 从 Cost 中选择 *,其中 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);
}
}
有什么方法可以提高性能:
我的执行计划:
最佳答案
如果您不INCLUDE
您尝试返回的所有列(因为它需要这样做),您在ScenarioID
上的非聚集索引可能没有帮助查找以获取其他列 - 如果该场景有很多行,您最终可能会进行普通的表扫描。这归结为统计数据,因此可能因服务器而异。
如果您可以避免查找的需要,您将获得更一致的性能。
关于c# - 优化查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27632807/