实体框架字段查询慢

时间:2016-03-11 20:03:01

标签: 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; }
}

当我在控制器中执行查询时,如果我执行firstordefault,结果需要15-18秒才能返回。如果我在哪里查询,结果几乎是瞬间的(小于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搜索的查询会一直快速返回。

非常感谢任何帮助或方向 - 我很困惑。

3 个答案:

答案 0 :(得分:2)

您的APN列是NULLABLE,使EF添加OR运算符,99%它使SQL“寻找”列(不使用索引)。使APN列NOT NULL。

答案 1 :(得分:2)

除了用户 skalinkin answer之外,您还可以将DbContextConfiguration.UseDatabaseNullSemantics属性设置为true

public class YourDbContext : DbContext
{
    public YourDbContext()
    {
        Configuration.UseDatabaseNullSemantics = true;
        // ...
    }
}

答案 2 :(得分:0)

需要15-18s的查询

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);