在列中检索大值的更快方法
Posted
技术标签:
【中文标题】在列中检索大值的更快方法【英文标题】:Faster way to retrieve large value in column 【发布时间】:2019-05-18 19:16:41 【问题描述】:我在 Azure 中使用 MVC、EF & Repository 和数据库。我有一张桌子,只有 5 列。 ID、名称、消息、例外和其他详细信息。异常和其他细节,两者都是 varchar(max) 数据类型。现在,Exceptions 列的最大字符串长度为 2300 字,而 otherdetails 列的最大字符串长度为 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
);
【问题讨论】:
我认为你的问题不是列中的大数据,而是记录数。您是否尝试过在Date
上建立索引?
你的问题是关于 Sql 而不是 MVC。
是的:不要拉大字符串,只拉message
和任何更大的字符串仅应要求提供。
@Nick - 它正在工作......我只是忘记了它;-)
【参考方案1】:
索引可以提高查询的性能,现在它会扫描所有表,因此查询工作非常缓慢。
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
【讨论】:
索引是解决方案。我只是忘记了。 ;-)【参考方案2】:问题不在于字段大小,而在于基于返回记录数的总数据大小。一整天,可以返回多少条记录? 10个,1000个?您正在尝试每条记录提取约 4k,因此根据记录的数量,这将对检索该数据所需的时间量产生很大影响。如果您确实需要所有这些数据,则至少应该实现服务器端分页以一次加载 10-50 条记录的页面。
另外,ErrorLogRepository.Get
返回什么,IQueryable<ErrorLog>
或 IEnumerable<ErrorLog>
?如果您返回IQueryable
并且存储库只是返回您的.Where()
标准的结果而不调用.ToList()
或类似的,那么一切都应该很好,但是如果您返回IEnumerable
那么你会加倍增加应用服务器上的内存使用。存储库将有效地执行“SELECT *”以将实体加载到内存中,然后您的后续 .Select
将创建一组新的视图模型。 (所需内存量的 2 倍。)
【讨论】:
以上是关于在列中检索大值的更快方法的主要内容,如果未能解决你的问题,请参考以下文章