Чтение большой таблицы Oracle с помощью SqlDataProvider - PullRequest
1 голос
/ 27 июня 2019

У меня есть таблица Oracle с 1,5 миллионами строк данных, которые мне нужно обработать;однако я продолжаю получать исключение Out Of Memory.Пример минимального кода, показывающий проблему:

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 Ответ

1 голос
/ 30 июня 2019

Seq.take, который вы здесь вызываете, уже выполняется над материализованным результатом - он не является частью генератора SQL-запросов - он во многом похож на вызов AsEnumerable () для объекта IQueryable <>.Весь SQL, который будет создан, основан на том, что происходит внутри query { ... } скобок.

Если вы прочитаете документы о F # SqlProvider, вы увидите, что есть специальные выражения, которые могутиспользоваться в операторе запроса:

let qdata = query {
  for somerow in ctx.myschema.sometable do
  sortBy (somerow.column)
  skip 30
  take 10
  select (somerow)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...