使用SqlDataProvider读取大型Oracle表

时间:2019-06-27 09:20:21

标签: oracle f# fsharp.data.typeproviders

我有一个Oracle表,其中需要处理150万行数据;但是我不断收到内存不足的异常。显示此问题的最小代码示例是:

module MyModule

open System
open FSharp.Data.Sql

type SQL = SqlDataProvider<ConnectionString = myConnectionString, DatabaseVendor = Common.DatabaseProviderTypes.ORACLE>

let getdata() =
    let ctx = SQL.GetDataContext(SelectOperations.DatabaseSide)
    let qdata= query {
        for somerow in ctx.myschema.sometable do
        select (somerow)
    }
    qdata |> Seq.take 10 |> Seq.iter (printfn "%A")  // Fails with both the Seq.take and without

是否可以使SqlDataProvider以可管理的块形式提供行?

1 个答案:

答案 0 :(得分:1)

您在此处调用的Seq.take已经在实现结果上执行-它不是SQL查询生成器的一部分-就像在IQueryable <>对象上调用AsEnumerable()一样。将要构造的所有SQL均基于query { ... }括号内发生的情况。

如果您read the docs关于F#SqlProvider,您会发现有一些特殊的表达式可以在查询语句中使用:

let qdata = query {
  for somerow in ctx.myschema.sometable do
  sortBy (somerow.column)
  skip 30
  take 10
  select (somerow)
}