C# 使用EF从SQL Server按日期时间间隔获取数据
我有一个股票表,大约每毫秒包含一种货币的价值。 这导致表中有数百万行(每月3 mil),我不知道如何在不出现内存异常的情况下查询超过2个月的数据 重点是我不需要每一行,只需要每隔一分钟(比如说1分钟、5分钟等)分隔的行。如果我可以通过查询来做到这一点,我可以将行数减少到合理的数量 现在我正在加载列表中的所有行C# 使用EF从SQL Server按日期时间间隔获取数据,c#,sql,sql-server,performance,entity-framework,C#,Sql,Sql Server,Performance,Entity Framework,我有一个股票表,大约每毫秒包含一种货币的价值。 这导致表中有数百万行(每月3 mil),我不知道如何在不出现内存异常的情况下查询超过2个月的数据 重点是我不需要每一行,只需要每隔一分钟(比如说1分钟、5分钟等)分隔的行。如果我可以通过查询来做到这一点,我可以将行数减少到合理的数量 现在我正在加载列表中的所有行 var resultTicks = new List<Tick> { ticks.First() }; for (var i = 1; i < ticks.Count(
var resultTicks = new List<Tick> { ticks.First() };
for (var i = 1; i < ticks.Count(); i++)
{
if (ticks[i].Data > resultTicks.Last().Data.AddMinutes(minutesInterval))
resultTicks.Add(ticks[i]);
}
var resultTicks=新列表{ticks.First()};
对于(var i=1;iresultTicks.Last().Data.AddMinutes(分钟间隔))
添加(勾号[i]);
}
这是我提供的最佳解决方案,但远远不是性能问题。我可以想出三种方法来提高您的性能 选项1: 您将希望尽可能地过滤您的结果,否则您将强制数据库生成这些结果
var resultTicks = ticks.GroupBy(t => t.Data.Year + "-" + t.Data.Month + "-" + t.Data.Day + " " + t.Data.Hour + ":" + t.Data.Minute)
.Select(t => new
{
Group = t.Key,
FirstRecord = t.FirstOrDefault()
})
.ToList();
选项2:
创建视图以允许优化查询。将此视图添加到实体框架中,就像添加普通表一样,并尽可能多地进行过滤,以减少数据库的负载
SELECT T.*
FROM Ticks T
(
SELECT
Currency,
CONVERT(VARCHAR(16), Data, 121) AS DateGroup,
MIN(Data) AS MinData
FROM dbo.Ticks
GROUP BY Currency, CONVERT(VARCHAR(16), Data, 121)
) TG ON TG.Currency = T.Currency
AND TG.MinData = T.Data;
选项3:
在每分钟的开始或结束时,将预期结果存储到汇总表中。这将阻止您的数据密集型过滤器和组。EF真的是一个好主意吗?我想你会使用一些特殊的索引或数据仓库哇,你真的需要所有这些数据吗?在将它们加载到系统中之前,您不应该提取/聚合它们吗?我认为任何解决方案都不能很好地处理此类数字,尽管使用EF的内存基解决方案将是最差的解决方案之一。表值函数是最佳选择。