首先我尝试过ARITHABORT OFF
在 SSMS 上仍然不到 1 秒。
我使用 EntityFrameWork:6.1.3 和 Azure Sql S1 层(我将尝试使用第 3 层,如果有变化,请通知您。)
我使用 EF Profiler 从 linq 获取生成的 sql。我查询了我共享的所有 linqs,它们在 SSMS 上都不到 1 秒。
我在审核日志表上有 300 万条记录。一位 ID 为 3 的客户拥有 170K 条记录,另一位 ID 为 35 的客户拥有 125 条记录。我将最小化代码。
审计日志模型:
public class AuditLog
{
public long? CustomerId { get; set; }
[ForeignKey("CustomerId")]
public virtual CustomerSummary Customer { get; set; }
[Required]
[Index]
public DateTime CreatedDate { get; set; }
}
第一个查询:
if (customer != null)
{
var customerId = customer.Id;
var result= Dbset.Where(x => x.CustomerId == customerId).OrderByDescending(x => x.CreatedDate).Skip(0).Take(25).ToList();
}
如果我尝试使用拥有 170k 行的客户,则会出现超时异常。如果我尝试与有 125 条记录的客户合作,那就没问题。
第二次查询:与第一个相同,我只包含客户。
if (customer != null)
{
var customerId = customer.Id;
var result= Dbset.Where(x => x.CustomerId == customerId).OrderByDescending(x => x.CreatedDate).Skip(0).Take(25).Include(x => x.Customer).ToList();
}
结果与第一个查询相反。如果我尝试与拥有 170k 行的客户合作,那就没问题。如果我尝试使用拥有 125 条记录的客户,则会出现超时异常。
第三次查询:与第一个查询相同,但我匹配long?
关于 customerId 的位置。
if (customer != null)
{
long? customerId = customer.Id;
var result= Dbset.Where(x => x.CustomerId == customerId).OrderByDescending(x => x.CreatedDate).Skip(0).Take(25).ToList();
}
结果与第一个查询相反。如果我尝试与拥有 170k 行的客户合作,那就没问题。如果我尝试使用拥有 125 条记录的客户,则会出现超时异常。
第四次查询:与第二个查询相同,但我匹配long?
关于 customerId 的位置。
if (customer != null)
{
long? customerId = customer.Id;
var result= Dbset.Where(x => x.CustomerId == customerId).OrderByDescending(x => x.CreatedDate).Skip(0).Take(25).Include(x => x.Customer).ToList();
}
结果与第二个查询相反。如果我尝试使用拥有 170k 行的客户,则会出现超时异常。如果我尝试与有 125 条记录的客户合作,那就没问题。
我真的很困惑。为什么内连接或将匹配参数更改为long?
结果正在改变吗?为什么所有查询在 SSMS 上运行不到 1 秒并在 ef linq 上给出错误?
Error:
{System.Data.SqlClient.SqlException(0x80131904):超时已过期。
操作完成之前超时时间已过或
服务器没有响应。 ---> System.ComponentModel.Win32Exception
(0x80004005):等待操作超时
System.Data.SqlClient.SqlConnection.OnError(SqlException异常,
布尔值breakConnection,Action`1wrapCloseInAction)
更新(19/04/2016):
After 伊万·斯托耶夫对评论提出建议。
您是否尝试过(只是为了测试)使用硬编码 3 和 35 而不是customerId
多变的?
我没有收到任何错误,并且查询速度与 SSMS 上一样最快。
更新(20/04/2016):真正的问题是参数嗅探。当我包含或更改参数为可为空时,实际上我创建了另一个查询和另一个查询计划。我为拥有 125 条记录的客户创建了一些计划,为拥有这 4 个查询的 170k 记录的客户创建了其他计划。这就是为什么我得到不同的结果。