私は4つのテーブルを持つ単純なDBを持っています。表Results
には18の列があります。それらのうち3つは外部キーです。それは一つのテーブル内のレコードの数を取得するのに約40秒かかりFSharp.Data.SqlProviderが遅い
#I @"..\packages\SQLProvider.1.1.3\lib"
#r "FSharp.Data.SqlProvider.dll"
open FSharp.Data.Sql
let [<Literal>] ConnectionStringmdf = @"Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=C:\Users\Me\Desktop\myDb.mdf;Integrated Security=True;Connect Timeout=10"
type Sqlmdf = SqlDataProvider<
ConnectionString = ConnectionStringmdf,
DatabaseVendor = Common.DatabaseProviderTypes.MSSQLSERVER,
IndividualsAmount = 1000,
UseOptionTypes = true,
CaseSensitivityChange = Common.CaseSensitivityChange.ORIGINAL
>
let dbm = Sqlmdf.GetDataContext()
printfn "Results count:\t %i" (dbm.Dbo.Results |> Seq.length)
:私はこのコードですべての結果(約800K)の数を取得しようとしています。
どうして遅いですか?私は間違って何をしていますか?
を使用できることを意味しているのIQueryableを実装 'Seq.length'は、全体の結果シーケンスが評価されます。そのため、行数をカウントするだけでなく、すべてのデータを取得することが必要です。何行ありますか? – TheQuickBrownFox
質問が更新されました - 約800000です。 – Alamakanambra
あなたのコードは 'SELECT COUNT(*)'を実行していません。メモリ内の*すべてのデータをロードし、返されたオブジェクトを数えています。私は40秒で800Kの行を読み込むのが速いと言うでしょう –