system.dll中的异常'System.OutOfMemoryException'

时间:2013-11-24 20:24:16

标签: c# sql sql-server-2008 optimization

我正在尝试选择表格中包含大约250万条记录的所有列。

但是在执行一段时间后它会抛出上述异常。如何解决这个问题

adapter.SelectCommand = new SqlCommand("SELECT * from Dwh_staging_table", con1);
adapter.Fill(DataSet2, "Transformed_Table");

3 个答案:

答案 0 :(得分:2)

我猜你正在处理一些自定义构建数据仓库解决方案,这意味着需要大量数据。无论您尝试做什么,都不应该将所有数据从数据库加载到应用程序,以便计算登台表中的某些数字。

您可以做的最好的事情是在将数据放入Dwh_staging_table之前计算您需要的任何内容,以便在问题发生之前解决问题。如果这不可能并且您已经将数据加载到数据库,则应该在数据库中进行所有处理(例如,使用讨厌的存储过程)。

通常,当您处理大量数据时,移动数据是您最大的敌人。尝试在现在数据的地方解决所有问题,无需不必要的转移。

如果你想将数据加载回c#代码(我不建议),尝试在不实现内存中所有数据的情况下完成所有操作。创建返回IEnumerable的存储库函数,它将在内部使用yield return,因此整个数据集合永远不会实现。

如果您仍然坚持在某些集合中实现数据(我不建议更多),请查看一些不使用顺序内存块的集合。使用像array,List或DataSet这样的集合会导致更高的memmory异常。尝试使用像LinkedList这样的东西,或者甚至更好的一些分块的LinkedList数组(几乎像其他帖子中建议的分页)。

修改 从你说的话

  

我在表格中有一些缺失的值我希望之后使用avg techninque填充一些列

对我来说,只是通过数据库中的临时表的一个UPDATE语句应该可以实现的东西。不确定您想要什么(例如,我想设置为按类别列分组的Metric列的AvgMetric平均值)。在这种情况下,它看起来像:

WITH t AS (
SELECT st.[Category]
      ,st.[AvgMetric]
      ,AVG(st.[Metric]) OVER (PARTITION BY [st.Category] AS [CalculatedAvgMetric]
  FROM [Dwh_staging_table] st
)
UPDATE t
   SET [AvgMetric] = [CalculatedAvgMetric]

答案 1 :(得分:0)

显而易见的答案是减少返回的数据集。你需要所有列吗?

分页数据怎么样?查看row_number()函数。

答案 2 :(得分:0)

使用自定义Paging.Fetch一次只限有限记录