Entity framework 实体框架字段查询速度慢

Entity framework 实体框架字段查询速度慢,entity-framework,Entity Framework,我在处理特定的ef查询时遇到一些问题。我已经尽可能地简化了一切。我只查询两列。这是我的模型 [Table("TAXROLL", Schema = "CLAND")] public class TaxRoll { [Key] [Column("TAXROLL_ID")] public string Id { get; set; } [Column("APN")] public string APN { get; set; } } 当我在控制器中执行查询时

我在处理特定的ef查询时遇到一些问题。我已经尽可能地简化了一切。我只查询两列。这是我的模型

[Table("TAXROLL", Schema = "CLAND")]
public class TaxRoll
{
    [Key]
    [Column("TAXROLL_ID")]
    public string Id { get; set; }

    [Column("APN")]
    public string APN { get; set; }
}
当我在控制器中执行查询时,如果我执行firstordefault,则返回结果需要15-18秒。如果我执行where查询,结果几乎是瞬间的,不到1秒,请参见下面我的注释计时语句。当我说15-18秒,几乎是瞬间,这就是我的数字来源

    [ResponseType(typeof(TaxRoll))]
    public async Task<IHttpActionResult> Get(string id)
    {
        //var start = DateTime.Now;
        //Debug.WriteLine("Starting Query");
        var apnRecord = await ctx.TaxRoll.FirstOrDefaultAsync(x => x.APN == id);
        //Debug.WriteLine("Returning APN after " + DateTime.Now.Subtract(start).TotalSeconds);
        return Ok(apnRecord);
    }
当我查询主键Id时,无论我如何运行查询,每次结果都会以一致的速度返回。这只是我查询APN时的一个问题。是的,APN已编制索引。它也是独一无二的。我可以用它作为PK,事实上我试过了。没有骰子。我知道,当我直接对数据库执行基于APN搜索的查询时,它始终快速返回


非常感谢您的任何帮助或指导,我完全糊涂了。

这个查询需要15-18秒

var apnRecord = await ctx.TaxRoll.FirstOrDefaultAsync(x => x.APN == id);

var apnRecord = await ctx.TaxRoll.Where(x => x.APN == id).FirstOrDefaultAsync();
如果您只是在Where中使用,那么数据库中的任何内容都不会具体化

也考虑使用秒表代替计算时间戳。

var sw = new Stopwatch(); 
sw.Start();
// do something
Debug.WriteLine(sw.Elapsed);

需要15-18秒的查询

var apnRecord = await ctx.TaxRoll.FirstOrDefaultAsync(x => x.APN == id);

var apnRecord = await ctx.TaxRoll.Where(x => x.APN == id).FirstOrDefaultAsync();
如果您只是在Where中使用,那么数据库中的任何内容都不会具体化

也考虑使用秒表代替计算时间戳。

var sw = new Stopwatch(); 
sw.Start();
// do something
Debug.WriteLine(sw.Elapsed);

您的APN列可为null,这使EF add或operator成为运算符,99%它使SQL搜索不使用索引的列。使APN列不为空

您的APN列是可空的,这使得EF add或operator运算符,99%使SQL查找不使用索引的列。使APN列不为空

除用户skalinkin外,您还可以将属性设置为true

除用户skalinkin外,还可以将属性设置为true


在Get的第一行添加这一行:ctx.Database.Log=s=>System.Diagnostics.Debug.WriteLines;然后发布EF生成的查询。数据库中APN列的类型是什么?APN列是一个varchar列,Id列也是,该行不会导致日志中出现任何其他内容。好的,我找到了为什么它没有附加到日志中。这是它生成的查询。从CLAND.TAXROLL Extent1中选择Extent1.TAXROLL\u ID,Extent1.APN,其中Extent1.APN LIKE:p\u linq\u 0或Extent1.APN为NULL,并且:p\u linq\u 0为NULL,ROWNUM将这一行添加到Get的第一行:ctx.Database.Log=s=>System.Diagnostics.Debug.WriteLines;然后发布EF生成的查询。数据库中APN列的类型是什么?APN列是一个varchar列,Id列也是,该行不会导致日志中出现任何其他内容。好的,我找到了为什么它没有附加到日志中。这是它生成的查询。从CLAND.TAXROLL Extent1中选择Extent1.TAXROLL\u ID,Extent1.APN,其中Extent1.APN LIKE:p\u linq\u 0或Extent1.APN为NULL,p\u linq\u 0为NULL,ROWNUM这是正确答案;虽然我没有DBA访问该表的权限,但在这种情况下,Ivan下面的答案也很有效;虽然我没有DBA访问该表的权限,但在这种情况下,Ivan下面的回答也很有效。