Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用EF从SQL Server按日期时间间隔获取数据_C#_Sql_Sql Server_Performance_Entity Framework - Fatal编程技术网

C# 使用EF从SQL Server按日期时间间隔获取数据

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(

我有一个股票表,大约每毫秒包含一种货币的价值。 这导致表中有数百万行(每月3 mil),我不知道如何在不出现内存异常的情况下查询超过2个月的数据

重点是我不需要每一行,只需要每隔一分钟(比如说1分钟、5分钟等)分隔的行。如果我可以通过查询来做到这一点,我可以将行数减少到合理的数量

现在我正在加载列表中的所有行

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的内存基解决方案将是最差的解决方案之一。表值函数是最佳选择。