我有一个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以可管理的块形式提供行?
答案 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)
}