检索列中较大值的更快方法

时间:2018-12-18 11:19:08

标签: c# sql asp.net-mvc entity-framework azure

我正在Azure中使用MVC,EF和存储库以及数据库。我有一个表,只有5列。 ID,名称,消息,例外和其他详细信息。异常和其他细节都是varchar(max)数据类型。现在,“例外”列的最大字符串长度是2300个字,其他详细信息列的最大字符串长度是1500个字。

  谁能告诉我,查找整个数据的更快方法?因为现在我要搜索一天的数据,所以花了将近20秒或更长时间才能执行。我在SQL中执行了相同的查询。但是花了同一时间。另外,我尝试使用表视图但要同时执行。 这是我的代码-

public IEnumerable<ErrorLogModel> GetErrorLogData(DateTime? startDate, DateTime? endDate)
    {
        return _unitOfWork.ErrorLogRepository.Get(e.Date >= startDate && e.Date <= endDate).Select(e => new ErrorLogModel
        {
            ID= e.ID,
            name = e.name,
            message= e.message,
            Exceptions = e.Exceptions,
            otherdetails = e.otherdetails
        });

    }

2 个答案:

答案 0 :(得分:0)

索引可以提高查询的性能,现在它会扫描所有表,因此查询的工作速度非常慢。

EF 6.1支持索引,请尝试像这样使用它:https://docs.microsoft.com/ru-ru/ef/ef6/modeling/code-first/data-annotations#index

[Index]
public DateTime ExceptionDate { get; set; } 

如果您更喜欢FluentAPI并使用EF 6.2,则可以使用以下答案:How to create index in Entity Framework 6.2 with code first

答案 1 :(得分:0)

问题不在于字段大小,而是取决于返回的记录数的总数据大小。一整天,可以返回多少记录? 10、1000?您尝试将每条记录拉到约4k,因此根据记录数,这将对检索该数据所需的时间有很大影响。如果确实需要所有这些数据,则至少应实现服务器端分页以一次加载10至50条记录的页面。

另外,ErrorLogRepository.GetIQueryable<ErrorLog>IEnumerable<ErrorLog>返回什么?如果您返回的是IQueryable,而存储库只是在不调用.Where()之类的情况下返回了.ToList()条件的结果,那么一切都应该不错,但是如果您返回的是{{ 1}},那么您将使应用服务器上的内存使用量增加一倍。存储库将有效地执行“ SELECT *”以将实体加载到内存中,然后您的后续工作IEnumerable将创建一组新的视图模型。 (需要的内存量的2倍。)